建造者模式
理论
建造者模式(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;
}

浙公网安备 33010602011771号