建造者模式
理论
建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
又叫生成器模式。建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。
建造者模式的使用场景:
主要用于创建一些复杂的对象,那些对象内部构建间的建造顺序通常是固定的,但对象内部的构建通常面临着复杂的变化。
建造者模式的好处:
可以使得建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
实例
根据用户的选择设计特定的产品
初步实现
#include <iostream> #include <list> using namespace std; //产品1 class ProductBulider1 { public: void Add(string _parts){ parts->push_back(_parts); } void Build(){ Add("部件A"); Add("部件B"); } void Show(){ cout << "产品A创建:"; for (list<string>::iterator it = parts->begin(); it != parts->end(); it++) { cout << *it << " "; } cout << endl; } private: list<string>* parts = new list<string>; }; //产品2 class ProductBulider2 { public: void Add(string _parts){ parts->push_back(_parts); } void Build(){ Add("部件X"); Add("部件Y"); } void Show(){ cout << "产品B创建:"; for (list<string>::iterator it = parts->begin(); it != parts->end(); it++) { cout << *it << " "; } cout << endl; } private: list<string>* parts = new list<string>; }; //客户端 int main() { ProductBulider1* productA = new ProductBulider1; productA->Build(); productA->Show(); ProductBulider2* productB = new ProductBulider2; productB->Build(); productB->Show(); delete productA; delete productB; system("pause"); return 0; }
建造者模式
#include <iostream> #include <list> using namespace std; //产品类 class Product { public: void Add(string _parts){ parts->push_back(_parts); } void Show() { cout << "产品创建:"; for (list<string>::iterator it = parts->begin(); it != parts->end(); it++){ cout << *it << " "; } cout << endl; } private: list<string>* parts = new list<string>; }; //抽象建造类 class Builder { public: //建造产品所需物品 virtual void BuilderPart1() = 0; virtual void BuilderPart2() = 0; //成品 virtual Product* GetResult() = 0; }; //具体建造者类1:设计产品1 class ConcreteBulider1 :public Builder { public: void BuilderPart1() { product->Add("部件A"); } void BuilderPart2() { product->Add("部件B"); } Product* GetResult() { return product; } private: Product* product = new Product; }; //具体建造者类2:设计产品2 class ConcreteBulider2 :public Builder { public: void BuilderPart1() { product->Add("部件X"); } void BuilderPart2() { product->Add("部件Y"); } Product* GetResult() { return product; } private: Product* product = new Product; }; //指挥者类 class Director { public: void Construct(Builder* _builder) { _builder->BuilderPart1(); _builder->BuilderPart2(); } }; //客户端 int main() { //请一个设计者 Director* director = new Director; //具体的建造者 Builder* b1 = new ConcreteBulider1; Builder* b2 = new ConcreteBulider2; //设计者指挥建造者生产 director->Construct(b1); Product* p1 = b1->GetResult(); p1->Show(); director->Construct(b2); Product* p2 = b2->GetResult(); p2->Show(); delete b1; delete b2; delete director; delete p1; delete p2; system("pause"); return 0; }