设计模式之六:Builder(转)

一、功能 

  将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 

  二、结构图

  各类之间的交互关系如下图所示:

  三、示例代码 

 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() ;    
View Code

四、实例

  (1)例子一。如下图所示:

  上图的功能是是把一个RTF文件转换为多种正文格式。RTFReader进行语法分析,然后将所有的token串逐一转换。可见builder就是一步步地把各个部分组装为一个整体。它封闭了组装的方法,组装出来的对象也大相径庭。

原文地址:https://www.cnblogs.com/wangzhijun/p/3466759.html