2019-08-09 | 设计模式 | UNLOCK

生成器(Builder)模式

生成器模式

Builder模式又叫生成器模式、创建器模式,用于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

相比于直接通过构造函数生成对象来说,构造器有一下优势:

  • 可以更加优雅的控制一个对象中的必须初始化属性和可选初始化属性,赋值更加灵活
  • 可以将属性的字段都设置成final,对象一旦创建成功则无法再修改

示例:

1.生成器类

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
30
31
32
33
34
35
36
37
38
39
public class Product {
private final String name;//属性私有化,final (必须)
private final int id;//必须
private final String describe;//可选
private final Date date;//可选

private Product(ProductBuilder builder){//构造器私有化,只能通过builder来初始化
this.name = builder.name;
this.id = builder.id;
this.describe = builder.describe;
this.date = builder.date;
}

public static class ProductBuilder {//外部入口
private final String name;//必须属性
private final int id;//必须
private String describe;//可选
private Date date;//可选

public ProductBuilder(String name, int id){//必须属性 放在构造器里面
this.name = name;
this.id = id;
}

public ProductBuilder describe(String describe){//可选属性 赋值,通过方法名很直观
this.describe = describe;
return this;
}

public ProductBuilder date(Date date){
this.date = date;
return this;
}

public Product build(){//build生成外部对象
return new Product(this);
}
}
}

使用

通过构造器创建一个product实例。

1
2
3
4
Product pc = new Product.ProductBuilder("pc", 1000)
.describe("good")
.date(new Date())
.build();

注意事项

  • 实例类的构造函数私有化,即外界无法通过类的构造器创建对象
  • 这个类是不可变的,所有属性都是final类型并且他们由构造器设置值。
  • 建造者的构造器只接受必须的参数,并且这些属性是仅有的被设置为final类型的,这样就能保证这些属性在构造器中是被赋值的。

Java中的StringBuilder、StringBuffer、ByteBuffer等都是用的这种模式。

生成器模式在android中使用的很多。

评论加载中