C++设计模式之建造者模式
·
建造者模式(Builder Pattern)是一种创建型设计模式,它将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示形式。这种模式特别适合创建那些具有复杂内部结构、包含多个组成部分的对象。
建造者模式的核心角色
- 产品(Product):被构建的复杂对象
- 抽象建造者(Builder):定义构建产品各个部分的接口
- 具体建造者(Concrete Builder):实现抽象建造者接口,具体构建产品
- 指挥者(Director):控制构建过程,按顺序调用建造者的方法
建造者模式的实现示例
下面以"电脑组装"为例展示建造者模式的实现,电脑由CPU、内存、硬盘等部件组成,我们可以通过不同的建造者创建不同配置的电脑:
#include <iostream>
#include <string>
#include <vector>
// 产品:电脑
class Computer {
private:
std::vector<std::string> parts;
public:
void addPart(const std::string& part) {
parts.push_back(part);
}
void show() const {
std::cout << "电脑配置如下:" << std::endl;
for (const auto& part : parts) {
std::cout << "- " << part << std::endl;
}
}
};
// 抽象建造者
class ComputerBuilder {
public:
virtual void buildCPU() = 0;
virtual void buildMemory() = 0;
virtual void buildHardDisk() = 0;
virtual void buildGraphicsCard() = 0;
virtual Computer* getResult() = 0;
virtual ~ComputerBuilder() = default;
};
// 具体建造者:游戏电脑建造者
class GamingComputerBuilder : public ComputerBuilder {
private:
Computer* computer;
public:
GamingComputerBuilder() {
computer = new Computer();
}
void buildCPU() override {
computer->addPart("高性能游戏CPU");
}
void buildMemory() override {
computer->addPart("32GB 高速内存");
}
void buildHardDisk() override {
computer->addPart("1TB 固态硬盘");
}
void buildGraphicsCard() override {
computer->addPart("顶级独立显卡");
}
Computer* getResult() override {
return computer;
}
};
// 具体建造者:办公电脑建造者
class OfficeComputerBuilder : public ComputerBuilder {
private:
Computer* computer;
public:
OfficeComputerBuilder() {
computer = new Computer();
}
void buildCPU() override {
computer->addPart("普通办公CPU");
}
void buildMemory() override {
computer->addPart("16GB 内存");
}
void buildHardDisk() override {
computer->addPart("512GB 固态硬盘");
}
void buildGraphicsCard() override {
computer->addPart("集成显卡");
}
Computer* getResult() override {
return computer;
}
};
// 指挥者:指导建造过程
class Director {
public:
void construct(ComputerBuilder* builder) {
builder->buildCPU();
builder->buildMemory();
builder->buildHardDisk();
builder->buildGraphicsCard();
}
};
// 客户端使用
int main() {
Director director;
// 构建游戏电脑
ComputerBuilder* gamingBuilder = new GamingComputerBuilder();
director.construct(gamingBuilder);
Computer* gamingComputer = gamingBuilder->getResult();
gamingComputer->show();
std::cout << std::endl;
// 构建办公电脑
ComputerBuilder* officeBuilder = new OfficeComputerBuilder();
director.construct(officeBuilder);
Computer* officeComputer = officeBuilder->getResult();
officeComputer->show();
// 释放资源
delete gamingComputer;
delete gamingBuilder;
delete officeComputer;
delete officeBuilder;
return 0;
}
建造者模式的工作流程
- 客户端创建指挥者对象和具体建造者对象
- 客户端将具体建造者对象交给指挥者
- 指挥者调用建造者的方法,按顺序构建产品各部分
- 客户端从建造者那里获取构建完成的产品
建造者模式与工厂模式的区别
- 工厂模式:关注于创建产品的整体,直接返回一个完整产品
- 建造者模式:关注于产品的构建过程,分步构建,最后再组装成完整产品
建造者模式的应用场景
- 需要创建的对象具有复杂的内部结构(包含多个成员变量)
- 需要创建的对象内部属性有一定的生成顺序或依赖关系
- 同一个创建过程需要生成不同表现形式的产品(如不同配置的电脑)
- 构建过程需要隔离,不暴露产品的内部结构和构建细节
建造者模式的优缺点
优点:
- 分离对象的构建与表示,使构建过程更加灵活
- 可以控制对象的构建过程,精细化管理每一步
- 便于扩展新的建造者,符合开放-封闭原则
- 隐藏产品的内部结构,降低客户端与产品的耦合
缺点:
- 增加了类的数量,系统复杂度有所提高
- 如果产品之间差异较大,需要定义多个建造者,可能导致类膨胀
建造者模式特别适合于构建复杂对象,如配置文件、文档、复杂UI组件等,它能使代码结构更清晰,构建过程更可控。
更多推荐


所有评论(0)