设计模式 构建者模式
概述: 当创建复杂对象的时候,可以使用构建者模式,把创建复杂对象的过程分离出来,并且保持对象内不同组合的灵活性。
角色和类图:
builder.png
产品(Product): 需要创建的复杂对象
构建者接口(Builder):构建者的接口抽象,把创建复杂对象的过程进行分步操作,支持流式编程
具体构建者(ConcreteBuilder):构建者的具体实现,通过build() 返回创建的产品。
指导者(Director): 使用构建器,按照步骤构建,最终获得需要的产品。
详细描述:
当某个产品对象,包含多种组合,例如套餐可以选择加可乐、蛋挞、薯条、汉堡、鸡翅等等,创建出符合需要的套餐,那创建某种套产的时候,需要一个参数完备的构造器。例如:
public Class Product {
public Product(String name, Chip chip, Cola cola, Hamberger hamberger, Tart tart, Pie pie, Chicken chicken) {
....
}
}
要记住这么长的产生顺序是很麻烦的,而且为了方便,可以重载出各种各样的构造器。
构建者模式可以解决这个问题,使得创建这种复杂的对象更轻松和优雅。
public Class Product {
private Chip chip;
private Cola cola;
Product(Cola cola, Chip, chip) {
this.chip = chip;
this.cola = cola;
}
@Override
public String toString() {
return "Product: " + chip + "," + cola ;
}
}
public Interface Builder {
Builder withChip(Chip chip);
Builder withCola(Cola cola);
Product build();
}
public Class KFCBuilder implements Builder {
private Chip chip;
private Cola cola;
public KFCBuilder() {
}
Builder withChip(Chip chip) {
this.chip = chip;
}
Builder withCola(Cola cola) {
this.cola = cola;
}
Product toBuild() {
return new product(chip, cola);
}
}
public Class Director {
public static void main(String) {
Builder builder = new KFCBuilder();
Product product = builder.withChip(new Chip()).withCola(new Cola()).build();
System.out.println(product);
}
}
在实际使用中,有一些变化,
- 构建器接口不是必须的,虽然会依赖具体实现,有的产品可能始终只需要一个具体构建器。
- 构建器有时候会是Product的public的静态内部类,这样builder的方法就可以访问到Product的域。
真实场景:
StringBuilder
-