一、概念
建造者模式(Builder Pattern):也叫构建者模式,或生成器模式,指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。简单点就是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。
优点:封装性好,构建和表示分离。
缺点:产品的组成部分必须相同,如添加新的特征需要修改建造器。
使用场景:当构造器的参数过多,而且这些参数有些是可选的参数,参数间有相互依赖关系等需求时,可以考虑使用建造者模式。
二、实现
代码是创建一杯奶茶,奶茶名字是必须的,不然不知道做什么,然后两个可选字段,是否加珍珠和椰果。后面的例子就会报错,因为没有设置名称,就和你去奶茶店给人家说:要一杯奶茶,加珍珠和椰果。所以什么奶茶呢?
java
public class MilkTea {
private String mTeaName;
private boolean mAddPearl;
private boolean mAddCoconut;//椰果
private MilkTea(Builder builder) {
this.mTeaName = builder.mTeaName;
this.mAddPearl = builder.mAddPearl;
this.mAddCoconut = builder.mAddCoconut;
}
public static class Builder {
private String mTeaName;
private boolean mAddPearl;
private boolean mAddCoconut;//椰果
public MilkTea build() {
if (TextUtils.isEmpty(mTeaName)) {
throw new IllegalArgumentException("teaName is illegal");
}
return new MilkTea(this);
}
public Builder setTeaName(String teaName) {
if (TextUtils.isEmpty(teaName)) {
throw new IllegalArgumentException("teaName is illegal");
}
this.mTeaName = teaName;
return this;
}
public Builder isAddPearl(boolean addPearl) {
this.mAddPearl = addPearl;
return this;
}
public Builder isAddCoconut(boolean coconut) {
this.mAddCoconut = coconut;
return this;
}
}
}
//使用
MilkTea milkTea = new MilkTea.Builder()
.isAddCoconut(true)
.isAddPearl(true)
.build();
三、与工厂模式的区别
工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。
建造者模式是用来创建同一种类型的复杂对象,通过设置不同的可选参数,"定制化"地创建不同的对象。