Builder(建造者)

3. Builder(建造者)

3.1 定义

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

3.2 适用场景

  使用建造者模式的典型场景如下。

  ■ 相同的方法,不同的执行顺序,产生不同的结果时,可以采用建造者模式。

  ■ 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。

  ■ 产品类非常复杂,或者产品类中的方法调用顺序不同产生了不同的效能,这个时候使用建造者模式。

  ■ 在对象创建过程中会使用到系统的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段没有发现,要通过创建者模式柔化创建过程,本身已经违反设计的最初目标。

3.3 c++源码

  1 #include <iostream>
  2 #include <string>
  3 
  4 using namespace std;
  5 
  6 // 一个产品由零件1 零件2 构成
  7 //具体的产品类
  8 class Product
  9 {
 10 public:
 11     void setPart1(string part1)
 12     {
 13         m_part1 = part1;
 14     }
 15 
 16     void setPart2(string part2)
 17     {
 18         m_part2 = part2;
 19     }
 20 
 21     string getPart1(){
 22         cout << m_part1 << endl;
 23         return m_part1;
 24     }
 25 
 26     string getPart2(){
 27         cout << m_part2 << endl;
 28         return m_part2;
 29     }
 30 
 31 private:
 32     string m_part1;
 33     string m_part2;
 34 };
 35 
 36 //抽象建造类,提供建造接口。
 37 class OrderBuilder
 38 {
 39 public:
 40     virtual ~OrderBuilder()
 41     {
 42         cout << "~OrderBuilder()" << endl;
 43     }
 44     virtual void setOrderPart1() = 0;
 45     virtual void setOrderPart2() = 0;
 46     virtual Product* getProduct() = 0;
 47 };
 48 
 49 //具体的建造类
 50 class FirstOrderBuilder : public OrderBuilder
 51 {
 52 public:
 53     FirstOrderBuilder()
 54     {
 55         m_Product = new Product;
 56     }
 57 
 58     ~FirstOrderBuilder()
 59     {
 60         cout << "~FirstOrderBuilder()" << endl;
 61         delete m_Product;
 62         m_Product = NULL;
 63     }
 64 
 65     void setOrderPart1()
 66     {
 67         m_Product->setPart1("first part1");
 68     }
 69 
 70     void setOrderPart2()
 71     {
 72         m_Product->setPart2("first part2");
 73     }
 74 
 75     Product* getProduct()
 76     {
 77         return m_Product;
 78     }
 79 
 80 private:
 81     Product* m_Product;
 82 };
 83 
 84 //具体的建造类
 85 class SecondOrderBuilder : public OrderBuilder
 86 {
 87 public:
 88     SecondOrderBuilder()
 89     {
 90         m_Product = new Product;
 91     }
 92 
 93     ~SecondOrderBuilder()
 94     {
 95         cout << "~SecondOrderBuilder()" << endl;
 96         delete m_Product;
 97         m_Product = NULL;
 98     }
 99 
100     void setOrderPart1()
101     {
102         m_Product->setPart1("second part1");
103     }
104 
105     void setOrderPart2()
106     {
107         m_Product->setPart2("second part2");
108     }
109 
110     Product* getProduct()
111     {
112         return m_Product;
113     }
114 
115 private:
116     Product* m_Product;
117 };
118 
119 //Director类,负责管理实例创建的依赖关系,指挥构建者类创建实例
120 class Director
121 {
122 public:
123     Director(OrderBuilder* builder) : m_pOrderBuilder(builder)
124     {
125     }
126     void construct()
127     {
128         m_pOrderBuilder->setOrderPart1();
129         m_pOrderBuilder->setOrderPart2();
130     }
131 
132 private:
133     OrderBuilder* m_pOrderBuilder;
134 };
135 
136 
137 int main()
138 {
139     OrderBuilder* mBuilder = new SecondOrderBuilder;
140     Director* director = new Director(mBuilder);
141     director->construct();
142     Product* order = mBuilder->getProduct();
143     order->getPart1();
144     order->getPart2();
145 
146     delete director;
147     director = NULL;
148 
149     delete mBuilder;
150     mBuilder = NULL;
151 
152 return 0;
153 }

 

上一篇:建造者模式(python)


下一篇:cocos2d-x 截取像素