文章目录
建造者模式
建造者模式是一种对象创建软件设计模式,旨在找到伸缩构造器反模式的解决方案。
伸缩性构造的反模式:指通过构造器实现对象构建参数初始化,如果对象属性比较多,导致构造器的参数个数不可控。
该模式将一个复杂对象的构建与它的表示分离 ,使得同样的构建过程可以创建不同的表示。
结构
建造者模式一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

在建造者模式结构图中包含如下几个角色:
- Builder(抽象建造者) :它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是
<font style="color:#DF2A3F;">buildPartXXXX()</font>,++它们用于创建复杂对象的各个部件++ ;另一类方法是<font style="color:#DF2A3F;">build()</font>,++它们用于返回复杂对象++。Builder既可以是抽象类,也可以是接口。 - ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
- Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
- Director(指挥者) :指挥者又称为导演类,++它负责安排复杂对象的建造次序++ ,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。++客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象++(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。
实现
根据谁来控制构建过程 以及构建目标的复杂程度。可以采用两种建造者模式:
| 特性 | 经典 GoF 建造者 (图一) | 流式建造者 (图二) |
|---|---|---|
| 是否有 Director | 有。Director 控制构建逻辑。 | 无。由调用者直接控制。 |
| 构建顺序 | 固定。由 Director 内部硬编码顺序。 | 灵活。由调用者随意链式调用。 |
| 主要目的 | 对象的表现多样化(换 Builder)。 | 对象的参数可选化(换参数)。 |
| 客户端关注点 | 关注"我要造哪种人"(选 Builder)。 | 关注"我要给英雄配什么装备"(调方法)。 |
| 代码复杂度 | 较高(抽象 Builder、多个具体实现、Director)。 | 较低(通常一个内部 Builder 类即可)。 |
经典 GoF 建造者模式

cpp
// 桑尼号
class SunnyShip
{
public:
// 添加零件
void addParts(string name)
{
m_parts.push_back(name);
}
void showParts()
{
for (const auto& item : m_parts)
{
cout << item << " ";
}
cout << endl;
}
private:
vector<string> m_parts;
};
// 梅利号
class MerryShip
{
public:
// 组装
void assemble(string name, string parts)
{
m_patrs.insert(make_pair(name, parts));
}
void showParts()
{
for (const auto& item : m_patrs)
{
cout << item.first << ": " << item.second << " ";
}
cout << endl;
}
private:
map<string, string> m_patrs;
};
cpp
// 生成器类
class ShipBuilder
{
public:
virtual void reset() = 0;
virtual void buildBody() = 0;
virtual void buildWeapon() = 0;
virtual void buildEngine() = 0;
virtual void buildInterior() = 0;
virtual ~ShipBuilder() {}
};
cpp
// 桑尼号生成器
class SunnyBuilder : public ShipBuilder
{
public:
SunnyBuilder()
{
reset();
}
~SunnyBuilder()
{
if (m_sunny != nullptr)
{
delete m_sunny;
}
}
// 提供重置函数, 目的是能够使用生成器对象生成多个产品
void reset() override
{
m_sunny = new SunnyShip;
}
void buildBody() override
{
m_sunny->addParts("神树亚当的树干");
}
void buildWeapon() override
{
m_sunny->addParts("狮吼炮");
}
void buildEngine() override
{
m_sunny->addParts("可乐驱动");
}
void buildInterior() override
{
m_sunny->addParts("豪华内室精装");
}
SunnyShip* getSunny()
{
SunnyShip* ship = m_sunny;
m_sunny = nullptr;
return ship;
}
private:
SunnyShip* m_sunny = nullptr;
};
// 梅利号生成器
class MerryBuilder : public ShipBuilder
{
public:
MerryBuilder()
{
reset();
}
~MerryBuilder()
{
if (m_merry != nullptr)
{
delete m_merry;
}
}
void reset() override
{
m_merry = new MerryShip;
}
void buildBody() override
{
m_merry->assemble("船体", "优质木材");
}
void buildWeapon() override
{
m_merry->assemble("武器", "四门大炮");
}
void buildEngine() override
{
m_merry->assemble("动力", "蒸汽机");
}
void buildInterior() override
{
m_merry->assemble("内室", "精装");
}
MerryShip* getMerry()
{
MerryShip* ship = m_merry;
m_merry = nullptr;
return ship;
}
private:
MerryShip* m_merry = nullptr;
};
cpp
// 主管类
class Director
{
public:
void setBuilder(ShipBuilder* builder)
{
m_builder = builder;
}
// 简约型
void builderSimpleShip()
{
m_builder->buildBody();
m_builder->buildEngine();
}
// 标准型
void builderStandardShip()
{
builderSimpleShip();
m_builder->buildWeapon();
}
// 豪华型
void builderRegalShip()
{
builderStandardShip();
m_builder->buildInterior();
}
private:
ShipBuilder* m_builder = nullptr;
};
cpp
// 建造桑尼号
void builderSunny()
{
Director* director = new Director;
SunnyBuilder* builder = new SunnyBuilder;
// 简约型
director->setBuilder(builder);
director->builderSimpleShip();
SunnyShip* sunny = builder->getSunny();
sunny->showParts();
delete sunny;
// 标准型
builder->reset();
director->setBuilder(builder);
director->builderStandardShip();
sunny = builder->getSunny();
sunny->showParts();
delete sunny;
// 豪华型
builder->reset();
director->setBuilder(builder);
director->builderRegalShip();
sunny = builder->getSunny();
sunny->showParts();
delete sunny;
delete builder;
delete director;
}
// 建造梅利号
void builderMerry()
{
Director* director = new Director;
MerryBuilder* builder = new MerryBuilder;
// 简约型
director->setBuilder(builder);
director->builderSimpleShip();
MerryShip* merry = builder->getMerry();
merry->showParts();
delete merry;
// 标准型
builder->reset();
director->setBuilder(builder);
director->builderStandardShip();
merry = builder->getMerry();
merry->showParts();
delete merry;
// 豪华型
builder->reset();
director->setBuilder(builder);
director->builderRegalShip();
merry = builder->getMerry();
merry->showParts();
delete merry;
delete builder;
delete director;
}
int main()
{
builderSunny();
cout << "=====================================" << endl;
builderMerry();
}
现代流式建造者模式

cpp
// 桑尼号
class SunnyShip
{
public:
// 添加零件
void addParts(string name)
{
m_parts.push_back(name);
}
void showParts()
{
for (const auto& item : m_parts)
{
cout << item << " ";
}
cout << endl;
}
private:
vector<string> m_parts;
};
// 梅利号
class MerryShip
{
public:
// 组装
void assemble(string name, string parts)
{
m_patrs.insert(make_pair(name, parts));
}
void showParts()
{
for (const auto& item : m_patrs)
{
cout << item.first << ": " << item.second << " ";
}
cout << endl;
}
private:
map<string, string> m_patrs;
};
cpp
class ShipBuilder
{
public:
virtual ShipBuilder* reset() = 0;
virtual ShipBuilder* buildBody() = 0;
virtual ShipBuilder* buildWeapon() = 0;
virtual ShipBuilder* buildEngine() = 0;
virtual ShipBuilder* buildInterior() = 0;
virtual ~ShipBuilder() {}
};
cpp
//桑尼号生成器
class SunnyBuilder : public ShipBuilder
{
public:
SunnyBuilder() { reset(); }
~SunnyBuilder() { if (m_sunny) delete m_sunny; }
// 返回指针以支持链式调用
SunnyBuilder* reset() override {
if (m_sunny) delete m_sunny;
m_sunny = new SunnyShip;
return this;
}
SunnyBuilder* buildBody() override {
m_sunny->addParts("神树亚当的树干");
return this;
}
SunnyBuilder* buildWeapon() override {
m_sunny->addParts("狮吼炮");
return this;
}
SunnyBuilder* buildEngine() override {
m_sunny->addParts("可乐驱动");
return this;
}
SunnyBuilder* buildInterior() override {
m_sunny->addParts("豪华内室精装");
return this;
}
// 最终获取产品
SunnyShip* getResult() {
SunnyShip* ship = m_sunny;
m_sunny = nullptr; // 转移所有权
return ship;
}
private:
SunnyShip* m_sunny = nullptr;
};
// 梅利号生成器
class MerryBuilder : public ShipBuilder
{
public:
MerryBuilder()
{
reset();
}
~MerryBuilder()
{
if (m_merry != nullptr) delete m_merry;
}
// 重置并返回自身指针
MerryBuilder* reset() override
{
if (m_merry != nullptr) delete m_merry;
m_merry = new MerryShip;
return this;
}
MerryBuilder* buildBody() override
{
m_merry->assemble("船体", "优质木材");
return this;
}
MerryBuilder* buildWeapon() override
{
m_merry->assemble("武器", "四门大炮");
return this;
}
MerryBuilder* buildEngine() override
{
m_merry->assemble("动力", "蒸汽机");
return this;
}
MerryBuilder* buildInterior() override
{
m_merry->assemble("内室", "精装");
return this;
}
// 最终获取成品
MerryShip* getMerry()
{
MerryShip* ship = m_merry;
m_merry = nullptr; // 释放控制权,防止析构时误删
return ship;
}
private:
MerryShip* m_merry = nullptr;
};
cpp
void builderSunny()
{
SunnyBuilder* builder = new SunnyBuilder();
// --- 流式调用示例 ---
// 1. 简约型:只造身体和引擎
SunnyShip* simpleSunny = builder->reset()
->buildBody()
->buildEngine()
->getResult();
cout << "简约型桑尼号: ";
simpleSunny->showParts();
delete simpleSunny;
// 2. 豪华型:全都要
SunnyShip* regalSunny = builder->reset()
->buildBody()
->buildEngine()
->buildWeapon()
->buildInterior()
->getResult();
cout << "豪华型桑尼号: ";
regalSunny->showParts();
delete regalSunny;
delete builder;
}
void builderMerry()
{
MerryBuilder* builder = new MerryBuilder;
cout << "--- 正在流式建造梅利号 ---" << endl;
// 1. 简约型:身体 + 动力
MerryShip* simpleMerry = builder->reset()
->buildBody()
->buildEngine()
->getMerry();
cout << "简约型: ";
simpleMerry->showParts();
delete simpleMerry;
// 2. 战斗型:身体 + 动力 + 武器 (链式调用不按顺序也没关系)
MerryShip* battleMerry = builder->reset()
->buildBody()
->buildWeapon()
->buildEngine()
->getMerry();
cout << "战斗型: ";
battleMerry->showParts();
delete battleMerry;
// 3. 豪华全配型
MerryShip* regalMerry = builder->reset()
->buildBody()
->buildEngine()
->buildWeapon()
->buildInterior()
->getMerry();
cout << "豪华型: ";
regalMerry->showParts();
delete regalMerry;
delete builder;
}
cpp
// 如果还要 Director,内部可以写成:
void constructRegal(ShipBuilder* b) {
b->reset()->buildBody()->buildEngine()->buildWeapon()->buildInterior();
}
特点
主要优点
- 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
- **每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。**由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合"开闭原则"。
- **可以更加精细地控制产品的创建过程。**将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
主要缺点
- **建造者模式所创建的产品一般具有较多的共同点,**其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。
适用环境
- 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
- 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
- 对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中。
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。