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 }