建造者模式

逐步构建

场景


  • 参数很多并且可选
  • 多个参数组合构造

代码


实现

Sample
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Product{
private String attr1;
private String attr2;

private Product(String attr1,String attr2){
//construct
}

//get

public static class Builder{
private String attr1;
private String attr2;

public Builder(){
}

public Builder attr1(String attr1){
this.attr1 = attr1;
return this;
}

//other attributes

public Product build(){
return new Product(attr1,attr2);
}
}
}

使用

Sample
1
Product p = new Product.Builder().attr1("foo").attr2("bar").build();

内部还可以新增一个辅助方法

Sample
1
2
3
public static Builder builder() {
return new Builder();
}

进一步简化调用为

Sample
1
Product p = Product.builder().attr1("foo").attr2("bar").build();

特征


  • 目标类private全参构造,并且只有get方法,相当于禁止脱离builder直接构造设值,
  • public静态内类Builder
    • 也可以单独外部类,但考虑到功能的专属性,更新需要同步,内类关系更紧密
    • 静态类只是声明不绑定类实例,不同于静态类成员,每次new建立builder独立,多线程不会共享
  • Builder链式设属性
  • Builder内建造方法调用目标类的构造函数

优缺点


  • 定义代码复杂,目标类属性重复定义
  • 使用代码可读性高,避免多参数传递

应用


java.util.Calendar