一、建造者模式核心概念
建造者模式是一种创建型设计模式,其核心思想是将复杂对象的构建过程与对象的表示分离,使得同样的构建过程可以创建出不同的对象表示。
在日常生活中,电脑组装就是建造者模式的典型应用:不同用户需要的电脑配置(如办公本、游戏本)差异很大,但组装流程是固定的------都需要安装CPU、主板、内存、显卡、硬盘等核心部件。这里的"固定组装流程"就是构建过程,"不同配置的电脑"就是不同的对象表示。
二、建造者模式的核心角色
-
产品(Product):需要构建的复杂对象,对应本例中的"电脑",包含多个组成部件。
-
抽象建造者(Abstract Builder):定义构建产品各个部件的抽象接口,规范构建流程,对应本例中的"电脑组装指南",明确需要组装哪些部件。
-
具体建造者(Concrete Builder):实现抽象建造者的接口,负责具体部件的构建和装配,对应本例中的"办公电脑组装师"和"游戏电脑组装师",分别组装不同配置的部件。
-
指挥者(Director):负责调用具体建造者按照固定流程构建产品,不直接参与部件构建,对应本例中的"装机负责人",负责把控组装顺序(先装主板、再装CPU等)。
三、代码示例:电脑组装的建造者模式实现
下面通过C++代码实现电脑组装场景,清晰展示建造者模式各角色的协作过程。
3.1 步骤1:定义产品类(电脑)
电脑作为复杂产品,包含CPU、主板、内存、显卡、硬盘等部件,提供添加部件和展示配置的方法。
cpp
#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 showConfig() const {
std::cout << "电脑配置清单:" << std::endl;
for (size_t i = 0; i < parts.size(); ++i) {
std::cout << i + 1 << ". " << parts[i] << std::endl;
}
}
};
3.2 步骤2:定义抽象建造者(电脑组装接口)
抽象建造者定义组装电脑核心部件的纯虚函数,以及获取最终产品的方法,规范组装流程。
cpp
// 抽象建造者:电脑组装接口
class AbstractComputerBuilder {
protected:
Computer* computer; // 指向待组装的电脑
public:
// 构造函数:初始化电脑对象
AbstractComputerBuilder() {
computer = new Computer();
}
// 析构函数:释放电脑对象
virtual ~AbstractComputerBuilder() {
delete computer;
}
// 纯虚函数:组装CPU(子类必须实现)
virtual void buildCPU() = 0;
// 纯虚函数:组装主板
virtual void buildMotherboard() = 0;
// 纯虚函数:组装内存
virtual void buildMemory() = 0;
// 纯虚函数:组装显卡
virtual void buildGraphicsCard() = 0;
// 纯虚函数:组装硬盘
virtual void buildHardDisk() = 0;
// 获取组装完成的电脑
Computer* getComputer() {
return computer;
}
};
3.3 步骤3:定义具体建造者(不同配置的组装师)
实现两个具体建造者:办公电脑组装师(侧重稳定性和性价比)、游戏电脑组装师(侧重高性能),分别实现不同部件的组装逻辑。
cpp
// 具体建造者1:办公电脑组装师
class OfficeComputerBuilder : public AbstractComputerBuilder {
public:
void buildCPU() override {
computer->addPart("Intel i5-12400(中端办公CPU,稳定节能)");
}
void buildMotherboard() override {
computer->addPart("华硕B660M-K(兼容i5,扩展性适中)");
}
void buildMemory() override {
computer->addPart("金士顿16GB DDR4 3200(满足办公多任务)");
}
void buildGraphicsCard() override {
computer->addPart("集成显卡UHD 730(无需独立显卡,节省成本)");
}
void buildHardDisk() override {
computer->addPart("三星500GB NVMe SSD(快速启动办公软件)");
}
};
// 具体建造者2:游戏电脑组装师
class GamingComputerBuilder : public AbstractComputerBuilder {
public:
void buildCPU() override {
computer->addPart("Intel i7-13700K(高端游戏CPU,多核性能强)");
}
void buildMotherboard() override {
computer->addPart("微星Z790-A WIFI(高端主板,支持超频)");
}
void buildMemory() override {
computer->addPart("芝奇32GB DDR5 6000(高频内存,游戏加载快)");
}
void buildGraphicsCard() override {
computer->addPart("NVIDIA RTX 4070 Ti(高端显卡,流畅运行3A游戏)");
}
void buildHardDisk() override {
computer->addPart("三星2TB NVMe SSD(大容量存储,装多个3A游戏)");
}
};
3.4 步骤4:定义指挥者(装机负责人)
指挥者负责控制组装流程,按照"主板→CPU→内存→硬盘→显卡"的固定顺序调用具体建造者的方法,确保组装逻辑统一。
cpp
// 指挥者:装机负责人(控制组装流程)
class Director {
private:
AbstractComputerBuilder* builder; // 指向具体组装师
public:
// 设置具体建造者
void setBuilder(AbstractComputerBuilder* b) {
builder = b;
}
// 固定组装流程:按顺序组装部件
void constructComputer() {
builder->buildMotherboard(); // 先装主板,再装CPU
builder->buildCPU();
builder->buildMemory();
builder->buildHardDisk();
builder->buildGraphicsCard();
}
};
3.5 步骤5:主函数测试(客户端使用)
客户端通过指挥者分别调用两个具体建造者,构建出办公电脑和游戏电脑,并展示不同配置。
cpp
int main() {
// 1. 组装办公电脑
Director director;
OfficeComputerBuilder officeBuilder;
director.setBuilder(&officeBuilder);
director.constructComputer(); // 按固定流程组装
Computer* officePC = officeBuilder.getComputer();
std::cout << "=== 办公电脑配置 ===" << std::endl;
officePC->showConfig();
// 2. 组装游戏电脑
GamingComputerBuilder gamingBuilder;
director.setBuilder(&gamingBuilder);
director.constructComputer(); // 同样的流程,不同配置
Computer* gamingPC = gamingBuilder.getComputer();
std::cout << "\n=== 游戏电脑配置 ===" << std::endl;
gamingPC->showConfig();
// 注意:产品由建造者创建,客户端无需手动释放(建造者析构时会释放)
return 0;
}
五、建造者模式的优势总结
-
解耦构建与表示:指挥者控制流程,建造者负责部件,客户端无需关心具体构建细节,只需选择建造者即可得到不同产品。
-
灵活扩展 :若需要新增"设计本"配置,只需新增一个
DesignComputerBuilder类,无需修改指挥者和其他建造者,符合"开闭原则"。 -
统一流程:确保所有产品都遵循相同的构建步骤,避免因流程混乱导致的产品问题(如先装CPU再装主板的错误)。
当需要构建包含多个部件、构建流程固定但配置可变的复杂对象时(如电脑、手机、家具等),建造者模式是最优选择之一。