首页 » 设计模式之禅(第2版) » 设计模式之禅(第2版)全文在线阅读

《设计模式之禅(第2版)》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所示。

图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;     }}  

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