11.2 建造者模式的定义

建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:

Separate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)

建造者模式的通用类图如图11-4所示。

image-20210928154822516

图11-4 建造者模式通用类图
在建造者模式中,有如下4个角色: - Product产品类

通常是实现了模板方法模式,也就是有模板方法和基本方法,这个参考第10章的模板方法模式。例子中的BenzModel和BMWModel就属于产品类。

  • Builder抽象建造者

规范产品的组建,一般是由子类实现。例子中的CarBuilder就属于抽象建造者。

  • ConcreteBuilder具体建造者

实现抽象类定义的所有方法,并且返回一个组建好的对象。例子中的BenzBuilder和BMWBuilder就属于具体建造者。

  • Director导演类

负责安排已有模块的顺序,然后告诉Builder开始建造,在上面的例子中就是我们的老大,××公司找到老大,说我要这个或那个类型的车辆模型,然后老大就把命令传递给我,我和我的团队就开始拼命地建造,于是一个项目建设完毕了。

建造者模式的通用源代码也比较简单,先看Product类,通常它是一个组合或继承(如模板方法模式)产生的类,如代码清单11-12所示。

代码清单11-12 产品类

1
2
3
4
5
public class Product {
public void doSomething(){
//独立业务处理
}
}

抽象建造者如代码清单11-13所示

代码清单11-13 抽象建造者

1
2
3
4
5
6
public abstract class Builder {
//设置产品的不同部分,以获得不同的产品
public abstract void setPart();
//建造产品
public abstract Product buildProduct();
}

其中,setPart方法是零件的配置,什么是零件?其他的对象,获得一个不同零件,或者不同的装配顺序就可能产生不同的产品。具体的建造者如代码清单11-14所示。

代码清单11-14 具体建造者

1
2
3
4
5
6
7
8
9
10
public class ConcreteProduct extends Builder {
private Product product = new Product();
//设置产品零件
public void setPart(){
/** 产品类内的逻辑处理 */ }
//组建一个产品
public Product buildProduct() {
return product;
}
}

需要注意的是,如果有多个产品类就有几个具体的建造者,而且这多个产品类具有相同接口或抽象类,参考我们上面的例子。

导演类如代码清单11-15所示。

代码清单11-15 导演类

1
2
3
4
5
6
7
8
9
public class Director {
private Builder builder = new ConcreteProduct();
//构建不同的产品public
Product getAProduct(){
builder.setPart();
/** 设置不同的零件,产生不同的产品 */
return builder.buildProduct();
}
}

导演类起到封装的作用,避免高层模块深入到建造者内部的实现类。当然,在建造者模式比较庞大时,导演类可以有多个。