一 概念
当需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要应用于一个设计模式,建造者模式,又叫生成器模式,建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户就只需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
二 角色
- 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 《大话设计模式》 程杰 著