一、功能
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
二、结构图
各类之间的交互关系如下图所示:
三、示例代码
1 class Product1 { /*...*/ } ; 2 class Product2 { /*...*/ } ; 3 4 class Builder //抽象基类 5 { 6 public: 7 virtual void BuilderPartA() {} //提供缺省实现 8 virtual void BuilderPartB() {} 9 virtual void BuilderPartC() {} 10 protected: 11 Builder() {} 12 } ; 13 14 class ConcreteBuilder1 : public Builder //创建Product1 15 { 16 public: 17 ConcreteBuilder1() : _product(NULL) {} 18 19 virtual void BuilderPartA() { /*...*/ } 20 virtual void BuilderPartB() { /*...*/ } 21 virtual void BuilderPartC() { /*...*/ } 22 23 virtual Product1* GetProduct1() 24 { return _product ; } //返回创建的Product1对象 25 private: 26 Product1 *_product ; 27 } ; 28 29 class ConcreteBuilder2 : public Builder //创建Product2 30 { 31 public: 32 ConcreteBuilder2() : _product(NULL) {} 33 34 virtual void BuilderPartA() { /*...*/ } 35 virtual void BuilderPartB() { /*...*/ } 36 virtual void BuilderPartC() { /*...*/ } 37 38 virtual Product2* GetProduct2() 39 { return _product ; } //返回创建的Product2对象 40 private: 41 Product2 *_product ; 42 } ; 43 44 class Director 45 { 46 public: 47 //创建对象(Director并不知道具体创建出来的对象是什么样的,只有调用该函数的client知道) 48 void Construct(Builder *builder) 49 { 50 builder->BuilderPartA() ; 51 builder->BuilderPartB() ; 52 builder->BuilderPartC() ; 53 } 54 } ; 55 56 客户端代码: 57 Director director ; 58 59 // 创建第一种对象 60 ConcreteBuilder1 *pBuilder1 = new ConcreteBuilder1() ; 61 director.Construct(pBuilder1) ; 62 Product1 *product1 = pBuilder1->GetProduct1() ; 63 64 // 创建第二种对象 65 ConcreteBuilder2 *pBuilder2 = new ConcreteBuilder2() ; 66 director.Construct(pBuilder2) ; 67 Product2 *product2 = pBuilder2->GetProduct2() ;
四、实例
(1)例子一。如下图所示:
上图的功能是是把一个RTF文件转换为多种正文格式。RTFReader进行语法分析,然后将所有的token串逐一转换。可见builder就是一步步地把各个部分组装为一个整体。它封闭了组装的方法,组装出来的对象也大相径庭。