定义
将一个复杂的对象,分成多分,使同样的构建过程,能有不同的表示,这样的设计模式被称为建造者模式。
参与者
Builder
为创建一个Product对象的各个部件指定抽象接口,稳定某一过程
ConcreteBuilder
实现Builder的接口以构造和装配该产品的各个部件
定义并明确它所创建的表示
提供一个检索产品的接口
Director
构造一个使用Builder接口的对象
Product
表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
适用性
- 当创建复杂对象的算法应该独立于该对象的组成部分时。
- 构造过程必须允许被构造的对象有不同的表示时。
- 创建一些复杂对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
效果
- 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
- 每个特定的建造者都独立于其它建造者和程序的其余部分,这提高拉模块化程度,并使得添加其建造者变的灵活简单。
- 因为每一个建造者都是根据数据来逐步构造出最终的产品的,因此对建造者构造的每个最终产品从头到尾有更好的控制能力。
模板代码
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 |
#include<iostream> #include<vector> using namespace std; class Product{ public: vector<int> pool; void Add(int part){ pool.push_back(part); } void show(){ cout<<"Show Product: "<<endl; for(int i = 0; i < pool.size(); i++){ cout<<pool[i]<<" "; } cout<<endl; } }; class Builder{ public: virtual void BuildA() = 0; virtual void BuildB() = 0; virtual Product* GetResult(){ return NULL; } }; class ConcreteBuilder1: public Builder{ public: void BuildA(){ product->Add(1); } void BuildB(){ product->Add(2); } Product* GetResult(){ return product; } private: Product* product = new Product(); }; class Director{ public: void Construct(Builder *builder){ builder->BuildA(); builder->BuildB(); } }; int main(){ Director *d = new Director(); Builder *b = new ConcreteBuilder1(); d->Construct(b); Product *pro = b->GetResult(); pro->show(); return 0; } |
实例代码
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 |
#include<iostream> using namespace std; class ComputerBuilder{ public: string CPU; string GPU; string RAM; virtual void BuildCPU() = 0; virtual void BuildGPU() = 0; virtual void BuildRAM() = 0; }; class AppleBuilder: public ComputerBuilder{ void BuildCPU(){ CPU = "Intel i9 Apple Inc."; cout<<"制造"<<CPU<<endl; } void BuildGPU(){ GPU = "RTX-2080 Apple Inc."; cout<<"制造"<<GPU<<endl; } void BuildRAM(){ RAM = "DDR4 5T Apple Inc."; cout<<"制造"<<RAM<<endl; } }; class DellBuilder: public ComputerBuilder{ void BuildCPU(){ CPU = "Intel i10 Dell Inc."; cout<<"制造"<<CPU<<endl; } void BuildGPU(){ GPU = "GTX-1080Ti Dell Inc."; cout<<"制造"<<GPU<<endl; } void BuildRAM(){ RAM = "DDR4 2T Dell Inc."; cout<<"制造"<<RAM<<endl; } }; class ComputerDirector{ public: ComputerDirector(ComputerBuilder* c){ _c = c; } void CreateComputer(){ _c->BuildCPU(); _c->BuildGPU(); _c->BuildRAM(); } private: ComputerBuilder * _c; }; int main(){ ComputerBuilder *cbapple = new AppleBuilder(); ComputerDirector *cd = new ComputerDirector(cbapple); cd->CreateComputer(); cout<<endl; ComputerBuilder *cbdell = new DellBuilder(); ComputerDirector *cd2 = new ComputerDirector(cbdell); cd2->CreateComputer(); return 0; } |