也叫建造者模式、构建器模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
在以下情况下可以使用 Builder 模式:
Builder:为创建一个 Product 对象的各个部件指定抽象接口。
ConcreteBuilder:实现 Builder 的接口以构造和装配该产品的各个部件;定义并明确它所创建的表示;提供一个检索产品的接口。
Director:构造一个使用 Builder 接口的对象。
Product:表示被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
它使你可以改变一个产品的内部表示。在改变该产品的内部表示时所要做的只是定义一个新的 ConcreteBuilder。
它将构造代码和表示代码分开,提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息。
它使你可以对构造过程进行更精细的控制。对象是在 Director 的控制下一步一步构造的,仅当产品构造完成时 Director 才从 Builder 中取回它。
通常有一个抽象的 Builder 类为 Director 可能要求的每一个构件定义一个操作。这些操作缺省情况下什么都不做。一个 ConcreateBuilder 类对它有兴趣创建的构件重定义这些操作。
生成器逐步的构造它们的产品。因此 Builder 类接口必须足够普遍。
通常由生成器生成的产品相差很大以至于没有抽象父类。
(从变化点的形式上来看,生成器和模板方法有点类似,模板方法只是把接口实现延迟到子类,但是生成器还需要创建任意个不同组合的对象,比模板方法遇到的问题要多一层变化)
#include <iostream> class Product { public: Product() {} Product(const Product& other) {} virtual ~Product() {} void doA(...) {} void doB(...) {} //用原型模式来创建product实例 Product* clone() { return new Product(*this); } }; class Builder { public: virtual ~Builder() {} virtual void partA(...) {} virtual void partB(...) {} virtual Product* getResult() = 0; }; class ConcreteBuilder1 : public Builder { public: ConcreteBuilder1() { product = new Product(); } void partA(...) override {} void partB(...) override {} Product* getResult() { return product->clone(); } private: Product* product; }; class Director { public: Director(Builder* ptr) : builder(ptr) {} Product* build() { builder->partA(); builder->partB(); return builder->getResult(); } private: Builder* builder; }; int main() { ConcreteBuilder1* builder = new ConcreteBuilder1(); Director* director = new Director(builder); Product* product = director->build(); // ... ... system("pause"); return 0; }
书籍:GOF《设计模式:可复用面向对象软件的基础》
视频:李建忠设计模式(版权问题,自行搜索)