例子说明1:炒菜没放盐和肯德基的标准化
例子说明2:画一个不同形态的小人(高矮胖瘦各不同)
/*
建造者模式(生成器模式):
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式可以将一个产品的内部表象与产品的生成过程分隔开来,从而可以使一个建造过程生成具有不同的内部表象的产品。
如果我们使用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到他们,而且具体的建造过程不需要知道
*/
#include<iostream>
#include<string>
#include<list>
using namespace std;
//产品类,由多个部件构成
class Product
{
private:
list<string> *parts = new list<string>();
public:
Product()
{
}
void Add(string part)
{
parts->push_back(part);
}
void Show()
{
cout << "\n 产品 创建--------" << endl;
for (auto e : (*parts))
{
cout << e << endl;
}
}
~Product()
{
if (parts != NULL)
{
delete parts;
parts = NULL;
}
}
};
//Builder类,抽象建造者类,确定由两个部件PartA和PartB组成并声明一个得到产品建造后结果的方法
/*
抽象类用来规定某个产品的必要组成部分,就像做菜必须要放盐,放酱油等等,画人必须要有头脚手躯干。
*/
class Builder
{
public:
virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
virtual Product& GetReult() = 0;
};
//具体建造者类,画一个胖子或者瘦子,加一勺盐两勺盐等过程的具体实现
class ConcreteBuilder1 : public Builder
{
private:
Product *product = new Product();
public:
virtual void BuildPartA()
{
product->Add("部件A");
}
virtual void BuildPartB()
{
product->Add("部件B");
}
virtual Product& GetReult()
{
return *product;
}
};
class ConcreteBuilder2 : public Builder
{
private:
Product *product = new Product();
public:
virtual void BuildPartA()
{
product->Add("部件X");
}
virtual void BuildPartB()
{
product->Add("部件Y");
}
virtual Product& GetReult()
{
return *product;
}
};
//指挥者类
class Director
{
public:
//用于控制具体构建哪些模块或者实现哪些步骤
void Construct(Builder* builder)
{
builder->BuildPartA();
builder->BuildPartB();
}
};
void Client()
{
//客户端不需要知道具体的建造过程,仅需要通过指挥者对象控制具体的构建内容
Director *director = new Director();
Builder *b1 = new ConcreteBuilder1();
Builder *b2 = new ConcreteBuilder2();
director->Construct(b1);
Product p1 = b1->GetReult();
p1.Show();
director->Construct(b2);
Product p2 = b2->GetReult();
p2.Show();
if (director != NULL)
{
delete director;
director = NULL;
}
if (b1 != NULL)
{
delete b1;
b1 = NULL;
}
if (b2 = NULL)
{
delete b2;
b2 = NULL;
}
}
int main()
{
Client();
system("pause");
return 0;
}
运行结果:
产品 创建--------
部件A
部件B
产品 创建--------
部件X
部件Y
请按任意键继续. . .