一 概念
当需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要应用于一个设计模式,建造者模式,又叫生成器模式,建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户就只需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
二 角色
- Builder 是为创建一个Product对象的各个部件制定的抽象接口
- ConcreteBuilder 是具体的创建者,实现Builder接口,构造和装配各个部件
- Product 具体的产品角色
- Director 指挥者,他是构建一个使用Builder接口的对象
三 C++代码实现
//建造者模式 #include "pch.h" #include <iostream> #include <string> #include <vector> using namespace std; //产品类-由多个部件组成 class Product { public: void Add(string part) //添加产品部件 { parts.push_back(part); } void Show() //列举所有的产品部件 { cout << "\n产品 创建 --" << endl; for (vector<string>::iterator it = parts.begin(); it != parts.end(); ++it) { cout << *(it) << endl; } } private: vector<string> parts; }; //Builder类-抽象建造者类,确定产品由两个部件PartA和PartB组成 //并声明一个得到产品建造后结果的方法GetResult class Builder { public: virtual void BuildPartA() = 0; virtual void BuildPartB() = 0; virtual Product* GetResult() = 0; }; //具体建造者类 class ConcreteBuilder1 : public Builder { public: ConcreteBuilder1() { product = new Product; } ~ConcreteBuilder1() { delete product; } void BuildPartA() override { product->Add("部件A"); } void BuildPartB() override { product->Add("部件B"); } Product* GetResult() override { return product; } private: Product* product; }; //具体建造者类 class ConcreteBuilder2 : public Builder { public: ConcreteBuilder2() { product = new Product; } ~ConcreteBuilder2() { delete product; } void BuildPartA() override { product->Add("部件X"); } void BuildPartB() override { product->Add("部件Y"); } Product* GetResult() override { return product; } private: Product* product; }; //指挥者类 class Director { public: void Construct(Builder* builder) { builder->BuildPartA(); builder->BuildPartB(); } }; //客户端 int main() { Director* director = new Director; Builder* b1 = new ConcreteBuilder1; Builder* b2 = new ConcreteBuilder2; //指挥者用ConcreteBuilder1的方法来建造产品 director->Construct(b1); Product* p1 = b1->GetResult(); p1->Show(); //指挥者用ConcreteBuilder2的方法来建造产品 director->Construct(b2); Product* p2 = b2->GetResult(); p2->Show(); system("pause"); return 0; }
参考资料
1 《大话设计模式C++实现-第13章-建造者模式》 https://blog.csdn.net/xiqingnian/article/details/42005627
2 《大话设计模式》 程杰 著
来源:https://www.cnblogs.com/Manual-Linux/p/11121394.html