3,建造者模式(Builder Pattern)

Posted 杜东洲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3,建造者模式(Builder Pattern)相关的知识,希望对你有一定的参考价值。

Builder模式  是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

                            创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象- 关注对象创建的各部分的创建过程

   适用情况一个对象的构建比较复杂,将一个对象的构建(?)和对象的表示(?)进行分离。

1) Builder:为创建产品各个部分,统一抽象接口。

2) ConcreteBuilder:具体的创建产品的各个部分,部分A, 部分B,部分C。

3) Director:构造一个使用Builder接口的对象。

4) Product:表示被构造的复杂对象。

ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

 

创建者模式和工厂模式的区别

Factory模式中:

1、有一个抽象的工厂。

2、实现一个具体的工厂---汽车工厂。

3、工厂生产汽车A,得到汽车产品A。

4、工厂生产汽车B,得到汽车产品B。 

这样做,实现了购买者和生产线的隔离。强调的是结果

    

Builder模式:

1、引擎工厂生产引擎产品,得到汽车部件A。

2、轮胎工厂生产轮子产品,得到汽车部件B。

3、底盘工厂生产车身产品,得到汽车部件C。

4、将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。

5、将这个整体送到汽车组装工厂,得到一个汽车产品。

这样做,目的是为了实现复杂对象生产线和其部件的解耦。强调的是过程

两者的区别在于:

  Factory模式不考虑对象的组装过程,而直接生成一个我想要的对象。  Factory模式所解决的问题是,工厂生产产品。

       Builder模式先一个个的创建对象的每一个部件,再统一组装成一个对象。Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。

       Builder模式不是很常用。模式本身就是一种思想。知道了就可以了。              

       设计模式就是一种思想。学习一个模式,花上一两个小时把此模式的意思理解了,就 够了。其精华的所在会在以后工作的设计中逐渐体现出来。

 

  1 #include <iostream>
  2 using namespace std;
  3 
  4 #include "string"
  5 //房子 只有get set 接口 
  6 class House
  7 {
  8 public:
  9     void setDoor(string door)
 10     {
 11         this->m_door = door;
 12     }
 13 
 14     void setWall(string wall)
 15     {
 16         this->m_wall = wall;
 17     }
 18     void setWindow(string window)
 19     {
 20         this->m_window = window;
 21     }
 22 
 23     //--
 24     string getDoor( )
 25     {
 26         cout << m_door << endl;
 27         return this->m_door ;
 28     }
 29 
 30     string getWall()
 31     {
 32         cout << m_wall << endl;
 33         return this->m_wall;
 34     }
 35     string getWindow()
 36     {
 37         cout << m_window << endl;
 38         return m_window;
 39     }
 40 
 41 private:
 42     string    m_door;
 43     string    m_wall;
 44     string    m_window;
 45 };
 46 //工程队 虚父类 
 47 class  Builder
 48 {
 49 public:
 50     virtual void buildWall() = 0;
 51     virtual void buildDoor() = 0;
 52     virtual void buildWindow() = 0;
 53     virtual House* getHouse() = 0;
 54 };
 55 
 56 //公寓工程队
 57 class  FlatBuilder : public Builder
 58 {
 59 public:
 60     FlatBuilder()
 61     {
 62         m_house = new House;
 63     }
 64     virtual void buildWall()
 65     {
 66         m_house->setWall(" flat wall");
 67     }
 68 
 69     virtual void buildDoor()
 70     {
 71         m_house->setDoor("flat door");
 72     }
 73 
 74     virtual void buildWindow()
 75     {
 76         m_house->setWindow("flat window");
 77     }
 78 
 79     virtual House* getHouse()
 80     {
 81         return m_house;
 82     }
 83 private:
 84     House *m_house;
 85 };
 86 
 87 //别墅 villa 工程队
 88 class  VillaBuilder : public Builder
 89 {
 90 public:
 91     VillaBuilder()
 92     {
 93         m_house = new House;
 94     }
 95     virtual void buildWall()
 96     {
 97         m_house->setWall(" villa wall");
 98     }
 99 
100     virtual void buildDoor()
101     {
102         m_house->setDoor("villa door");
103     }
104 
105     virtual void buildWindow()
106     {
107         m_house->setWindow("villa window");
108     }
109 
110     virtual House* getHouse()
111     {
112         return m_house;
113     }
114 private:
115     House *m_house;
116 };
117 
118 //设计师(指挥者) 负责建造逻辑  
119 //建筑队 干具体的活
120 class Director 
121 {
122 public:
123     Director( Builder * build)
124     {
125         m_build = build;
126     }
127     void Construct()
128     {
129         m_build->buildWall();
130         m_build->buildWindow();
131         m_build->buildDoor();
132     }
133 private:
134      Builder * m_build;
135 };
136 
137 
138 void main()
139 {
140     House        *house  = NULL;
141     Builder        *builder = NULL;
142     Director    *director = NULL;
143 
144     // 请一个建造别墅的工程队
145     builder = new VillaBuilder;
146 
147     //设计师 指挥 工程队 干活
148     director = new Director(builder);
149     director->Construct(); 
150     house  =  builder->getHouse();
151     house->getWindow();
152     house->getDoor();
153 
154     delete house;
155     delete builder;
156 
157     //请 FlatBuilder 公寓
158     builder = new FlatBuilder;
159     director = new Director(builder);
160     director->Construct(); 
161     house  =  builder->getHouse();
162     house->getWindow();
163     house->getDoor();
164     delete house;
165     delete builder;
166 
167 
168     delete director;
169     system("pause");
170     return ;
171 }

 

以上是关于3,建造者模式(Builder Pattern)的主要内容,如果未能解决你的问题,请参考以下文章

建造者模式(Builder Pattern)

建造者模式(Builder Pattern)

建造者模式(Builder Pattern)

[05]Go设计模式:建造者模式(Builder Pattern)

JavaScript设计模式学习——builder pattern(建造者模式)

设计模式Builder Pattern建造者模式