建造者模式又叫生成器模式,是一种对象的构建模式。它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。创建者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
建造者模式的四个核心角色
使用建造者模式,创建一个盖房子的程序,UML类图如下:
代码实现
#include <iostream>
using namespace std;
// 产品
class House {
public:
string m_base; // 地基
string m_wall; // 墙
string m_roof; // 屋顶
};
// 抽象的建造者
class IHouseBuilder {
public:
virtual void BuildBase();
virtual void BuildWall();
virtual void BuildRoof();
virtual House* Build();
};
// 具体的建造者:创建普通房子
class CommonHouseBuilder : public IHouseBuilder
{
public:
void BuildBase() override {
cout << "普通房:打地基" << endl;
}
void BuildWall() override {
cout << "普通房:建墙" << endl;
}
void BuildRoof() override {
cout << "普通房:建房顶" << endl;
}
House* Build() {
return new House;
}
};
// 具体的建造者:创建高楼
class HighHouseBuilder : public IHouseBuilder
{
public:
void BuildBase() override {
cout << "高楼:打地基" << endl;
}
void BuildWall() override {
cout << "高楼:建墙" << endl;
}
void BuildRoof() override {
cout << "高楼:建房顶" << endl;
}
House* Build() override {
return new House;
}
};
// 指挥官
class Director {
public:
void SetBuilder(IHouseBuilder *pBuilder) {
m_pBuilder = pBuilder;
}
// 创建产品
House* Construct() {
m_pBuilder->BuildBase();
m_pBuilder->BuildWall();
m_pBuilder->BuildRoof();
return m_pBuilder->Build();
}
private:
IHouseBuilder* m_pBuilder;
};
int main()
{
// 创建盖房子的指挥官
Director *pDirector = new Director;
// 具体的建造者
IHouseBuilder *pCommonHouseBuilder = new CommonHouseBuilder;
IHouseBuilder *pHighHouseBuilder = new HighHouseBuilder;
// 盖普通房子
pDirector->SetBuilder(pCommonHouseBuilder);
House *pCommonHouse = pDirector->Construct();
// 盖高楼
pDirector->SetBuilder(pHighHouseBuilder);
House *pHighHouse = pDirector->Construct();
return 0;
}
建造者模式唯一区别于工厂模式的是针对复杂对象的创建。也就是说,如果创建简单对象,通常都是使用工厂模式进行创建,而如果创建复杂对象,就可以考虑使用建造者模式。
当需要创建的产品具备复杂创建过程时,可以抽取出共性创建过程,然后交由具体实现类自定义创建流程,使得同样的创建行为可以生产出不同的产品,使创建产品的灵活性大大增加。
建造者模式主要适用于以下应用场景:
建造者模式和工厂模式主要有下面这些区别