ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
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所示。 ![](https://box.kancloud.cn/2016-08-14_57b0036237ee0.jpg) 图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();      } } 导演类起到封装的作用,避免高层模块深入到建造者内部的实现类。当然,在建造者模式比较庞大时,导演类可以有多个。