建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:
Separate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)
建造者模式的通用类图如图11-4所示。
图11-4 建造者模式通用类图
在建造者模式中,有如下4个角色:
● Product产品类
通常是实现了模板方法模式,也就是有模板方法和基本方法,这个参考第10章的模板方法模式。例子中的BenzModel和BMWModel就属于产品类。
● Builder抽象建造者
规范产品的组建,一般是由子类实现。例子中的CarBuilder就属于抽象建造者。
● ConcreteBuilder具体建造者
实现抽象类定义的所有方法,并且返回一个组建好的对象。例子中的BenzBuilder和BMWBuilder就属于具体建造者。
● Director导演类
负责安排已有模块的顺序,然后告诉Builder开始建造,在上面的例子中就是我们的老大,××公司找到老大,说我要这个或那个类型的车辆模型,然后老大就把命令传递给我,我和我的团队就开始拼命地建造,于是一个项目建设完毕了。
建造者模式的通用源代码也比较简单,先看Product类,通常它是一个组合或继承(如模板方法模式)产生的类,如代码清单11-12所示。
代码清单11-12 产品类
public class Product { public void doSomething{ //独立业务处理 }}
抽象建造者如代码清单11-13所示。
代码清单11-13 抽象建造者
public abstract class Builder { //设置产品的不同部分,以获得不同的产品 public abstract void setPart; //建造产品 public abstract Product buildProduct;}
其中,setPart方法是零件的配置,什么是零件?其他的对象,获得一个不同零件,或者不同的装配顺序就可能产生不同的产品。具体的建造者如代码清单11-14所示。
代码清单11-14 具体建造者
public class ConcreteProduct extends Builder { private Product product = new Product; //设置产品零件 public void setPart{ /* * 产品类内的逻辑处理 */ } //组建一个产品 public Product buildProduct { return product; }}
需要注意的是,如果有多个产品类就有几个具体的建造者,而且这多个产品类具有相同接口或抽象类,参考我们上面的例子。
导演类如代码清单11-15所示。
代码清单11-15 导演类
public class Director { private Builder builder = new ConcreteProduct; //构建不同的产品 public Product getAProduct{ builder.setPart; /* * 设置不同的零件,产生不同的产品 */ return builder.buildProduct; }}
导演类起到封装的作用,避免高层模块深入到建造者内部的实现类。当然,在建造者模式比较庞大时,导演类可以有多个。