建造者模式
设计模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。
Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
对象的创建: Builder模式是为对象的创建而设计的模式-创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象-关注对象创建的各部分的创建过程:不同的工厂(这里指 builder生成器)对产品属性有不同的创建方法。
1) Builder:为创建产品各个部分,统一抽象接口。
2) ConcreteBuilder:具体的创建产品的各个部分,部分A,部分B,部分C.
3) Director:构造一个使用 Builder接口的对象。
4) Product:表示被构造的复杂对象。
Concrete Builder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类包括将这些部件装配成最终产品的接口。
工程队负责干活,设计师负责其逻辑。
适用情况:一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
| #include <iostream>
using namespace std;
class House { public: void setDoor(string door) { m_door = door; }
string getDoor() { return m_door; }
void setWall(string Wall) { m_wall = Wall; }
string getWall() { return m_wall; }
void setWindow(string Window) { m_window = Window; }
string getWindow() { return m_window; }
protected: private: string m_door; string m_wall; string m_window; };
class Builder { public: virtual void makeDoor() = 0; virtual void makeWall() = 0; virtual void makeWindow() = 0; virtual House* getHouse() = 0; protected: private: };
class FlatBuilder:public Builder { public: FlatBuilder() { m_house = new House(); } virtual void makeDoor() { m_house->setDoor("Flat Door!"); }; virtual void makeWall() { m_house->setWall("Flat Wall!"); } virtual void makeWindow() { m_house->setWindow("Flat Window!"); } virtual House* getHouse() { return m_house; } protected: private: House* m_house; };
class VillaBuilder : public Builder { public: VillaBuilder() { m_house = new House(); } virtual void makeDoor() { m_house->setDoor("Villa Door!"); }; virtual void makeWall() { m_house->setWall("Villa Wall!"); } virtual void makeWindow() { m_house->setWindow("Villa Window!"); } virtual House* getHouse() { return m_house; } protected: private: House* m_house; };
class Director { public: Director(Builder* builder) { m_builder = builder; };
void Construct() { m_builder->makeWall(); m_builder->makeDoor(); m_builder->makeWindow(); } protected: private: Builder* m_builder; };
int main() { VillaBuilder* villaBuilder = new VillaBuilder(); Director* director = new Director(villaBuilder); director->Construct(); House* house = villaBuilder->getHouse(); cout << house->getDoor() << " and " << house->getWall() << " and " << house->getWindow() << endl;
delete house; delete villaBuilder;
FlatBuilder* flatBuilder = new FlatBuilder(); director = new Director(flatBuilder); director->Construct(); house = flatBuilder->getHouse(); cout << house->getDoor() << " and " << house->getWall() << " and " << house->getWindow() << endl; cout << "Hello world!" << endl; return 0; }
|
输出:
1 2 3
| Villa Door! and Villa Wall! and Villa Window! Flat Door! and Flat Wall! and Flat Window! Hello world!
|