构建者模式学习

介绍

Builder模式可用于创建一个复杂对象。用户往往不知道内部情况,可以通过构建方法来精细控制构建过程。顾名思义,Build作为创建一个类的中介类,使用Builder的方法来设置要创建类中的各个需要的参数并进行构建对应的对象。第三方库中经常能看到这样的设计模式。

使用场景

需要创建一个比较复杂的类,需要多个构造函数的时候,或者参数多,且很多参数都有可以默认值的时候。

简单实现

  1 package org.sang.bean;
  2 
  3 import java.math.BigDecimal;
  4 import java.util.Objects;
  5 
  6 /**
  7  * 构建者模式
  8  */
  9 public class Bank {
 10 
 11     private Integer bankId;
 12     private String bankName;
 13     private String bankCode;
 14     private BigDecimal bankDiscount;
 15 
 16     public Integer getBankId() {
 17         return bankId;
 18     }
 19 
 20     public void setBankId(Integer bankId) {
 21         this.bankId = bankId;
 22     }
 23 
 24     public String getBankName() {
 25         return bankName;
 26     }
 27 
 28     public void setBankName(String bankName) {
 29         this.bankName = bankName;
 30     }
 31 
 32     public String getBankCode() {
 33         return bankCode;
 34     }
 35 
 36     public void setBankCode(String bankCode) {
 37         this.bankCode = bankCode;
 38     }
 39 
 40     public BigDecimal getBankDiscount() {
 41         return bankDiscount;
 42     }
 43 
 44     public void setBankDiscount(BigDecimal bankDiscount) {
 45         this.bankDiscount = bankDiscount;
 46     }
 47 
 48     public static class Builder {
 49         private Integer bankId;
 50         private String bankName;
 51         private String bankCode;
 52         private BigDecimal bankDiscount;
 53 
 54         public Bank.Builder setBankId(Integer bankId) {
 55             this.bankId = bankId;
 56             return this;
 57         }
 58 
 59         public Bank.Builder setBankName(String bankName) {
 60             this.bankName = bankName;
 61             return this;
 62         }
 63 
 64         public Bank.Builder setBankCode(String bankCode) {
 65             this.bankCode = bankCode;
 66             return this;
 67         }
 68 
 69         public Bank.Builder setBankDiscount(BigDecimal bankDiscount) {
 70             this.bankDiscount = bankDiscount;
 71             return this;
 72         }
 73 
 74         public Bank build() {
 75             return new Bank(this);
 76         }
 77     }
 78 
 79     @Override
 80     public boolean equals(Object o) {
 81         if (this == o) return true;
 82         if (o == null || getClass() != o.getClass()) return false;
 83         Bank bank = (Bank) o;
 84         return bankId.equals(bank.bankId) &&
 85                 bankCode.equals(bank.bankCode);
 86     }
 87 
 88     @Override
 89     public int hashCode() {
 90         return Objects.hash(bankId, bankCode);
 91     }
 92 
 93     @Override
 94     public String toString() {
 95         return "Bank{" +
 96                 "bankId=" + bankId +
 97                 ", bankName='" + bankName + '\'' +
 98                 ", bankCode='" + bankCode + '\'' +
 99                 ", bankDiscount=" + bankDiscount +
100                 '}';
101     }
102 
103     public Bank(Builder builder) {
104         this.bankId = builder.bankId;
105         this.bankName = builder.bankName;
106         this.bankCode = builder.bankCode;
107         this.bankDiscount = builder.bankDiscount;
108     }
109 
110     public static void main(String[] args) {
111         Bank bank = new Bank.Builder()
112                 .setBankId(1231)
113                 .setBankCode("IBC")
114                 .setBankDiscount(BigDecimal.valueOf(11))
115                 .setBankName("测试银行")
116                 .build();
117         System.out.println(bank.toString());
118     }
119 
120 }
View Code

总结

构建模式可以很方便的,在我们使用某个可动态配置功能的时候,进行行为配置参数配置等,不要忘记它的使用场景哦。可动态配置,那么就应该有一个默认配置哦,在有这种情况下,你就可以想想是不是可以采用构建者模式了

posted @ 2019-09-17 19:35  酱油飘香  阅读(158)  评论(1编辑  收藏  举报