建造者模式(Builder)------ 一步一步拼出来
大白话解释
你去点外卖套餐,可以自己一步步选:
- 选主食(汉堡 / 鸡腿)
- 选饮料(可乐 / 橙汁)
- 选大小(中杯 / 大杯)
- 要不要加辣
👉 你不是一次性拿到结果,而是一步一步 配置出来
最后点下单,才得到完整套餐。
👉 重点是:
- 怎么一步步选(构建过程)
- 和最终吃什么 (最终产品)
是分开的
建造者模式:把一个复杂对象的构建过程拆分成多个步骤,可以用同样的构建步骤创造出不同的对象。重点是------构建过程和最终产品分开。
常见场景:
- SQL 查询构建器(
SELECT * FROM users WHERE id=1 ORDER BY name) - HTTP 请求构建(设置 URL、Header、Body、超时时间)
- 游戏角色创建(选职业、装备、技能)
- 笔记本选配
核心思路
- 产品类:最终要创建的复杂对象
- 建造者接口:定义所有构建步骤
- 具体建造者:实现具体步骤
- 指挥者(Director):按顺序调用步骤(可选,用于封装固定套餐)
C++ 代码示例
场景:构建电脑配置,支持"游戏本"和"办公本"两种预设,也支持自定义。
cpp
#include <iostream>
#include <string>
#include <memory>
// ==============================
// 产品:电脑
// ==============================
struct Computer {
std::string cpu;
std::string gpu;
int ramGB = 0;
int storageGB = 0;
std::string monitor;
void describe() const {
std::cout << "【电脑配置】\n";
std::cout << " CPU: " << cpu << "\n";
std::cout << " GPU: " << gpu << "\n";
std::cout << " 内存: " << ramGB << "GB\n";
std::cout << " 存储: " << storageGB << "GB\n";
std::cout << " 显示器: " << monitor << "\n";
}
};
// ==============================
// 建造者接口
// ==============================
class ComputerBuilder {
public:
virtual ~ComputerBuilder() = default;
virtual ComputerBuilder& setCPU(const std::string& cpu) = 0;
virtual ComputerBuilder& setGPU(const std::string& gpu) = 0;
virtual ComputerBuilder& setRAM(int gb) = 0;
virtual ComputerBuilder& setStorage(int gb) = 0;
virtual ComputerBuilder& setMonitor(const std::string& monitor) = 0;
virtual Computer build() = 0;
};
// ==============================
// 具体建造者
// ==============================
class StandardComputerBuilder : public ComputerBuilder {
private:
Computer computer;
public:
ComputerBuilder& setCPU(const std::string& cpu) override {
computer.cpu = cpu;
return *this;
}
ComputerBuilder& setGPU(const std::string& gpu) override {
computer.gpu = gpu;
return *this;
}
ComputerBuilder& setRAM(int gb) override {
computer.ramGB = gb;
return *this;
}
ComputerBuilder& setStorage(int gb) override {
computer.storageGB = gb;
return *this;
}
ComputerBuilder& setMonitor(const std::string& monitor) override {
computer.monitor = monitor;
return *this;
}
Computer build() override {
return computer; // 返回最终产品
}
};
// ==============================
// 指挥者:封装预设套餐
// ==============================
class ComputerDirector {
public:
// 游戏本预设
Computer buildGamingPC(ComputerBuilder& builder) {
return builder
.setCPU("Intel i9-13900K")
.setGPU("NVIDIA RTX 4090")
.setRAM(32)
.setStorage(2000)
.setMonitor("4K 144Hz 曲面显示器")
.build();
}
// 办公本预设
Computer buildOfficePC(ComputerBuilder& builder) {
return builder
.setCPU("Intel i5-13500")
.setGPU("Intel 核显")
.setRAM(16)
.setStorage(512)
.setMonitor("1080P 普通显示器")
.build();
}
};
int main() {
ComputerDirector director;
// 用预设套餐
std::cout << "=== 游戏本 ===\n";
StandardComputerBuilder gamingBuilder;
Computer gamingPC = director.buildGamingPC(gamingBuilder);
gamingPC.describe();
std::cout << "\n=== 办公本 ===\n";
StandardComputerBuilder officeBuilder;
Computer officePC = director.buildOfficePC(officeBuilder);
officePC.describe();
// 自定义配置(链式调用)
std::cout << "\n=== 自定义配置 ===\n";
StandardComputerBuilder customBuilder;
Computer customPC = customBuilder
.setCPU("AMD Ryzen 7 7800X")
.setGPU("AMD RX 7900 XTX")
.setRAM(64)
.setStorage(4000)
.setMonitor("超宽曲面显示器")
.build();
customPC.describe();
return 0;
}
输出:
=== 游戏本 ===
【电脑配置】
CPU: Intel i9-13900K
GPU: NVIDIA RTX 4090
内存: 32GB
存储: 2000GB
显示器: 4K 144Hz 曲面显示器
=== 办公本 ===
【电脑配置】
CPU: Intel i5-13500
...
=== 自定义配置 ===
【电脑配置】
CPU: AMD Ryzen 7 7800X
...
优缺点
| 说明 | |
|---|---|
| ✅ 优点 | 构建步骤清晰,可读性好 |
| ✅ 优点 | 同样的步骤可产出不同配置的对象 |
| ✅ 优点 | 链式调用非常优雅 |
| ❌ 缺点 | 需要创建多个建造者类,代码量增加 |
| ❌ 缺点 | 产品结构变化时,建造者也要改 |
一句话记忆
建造者模式 = 点外卖自定义套餐,一步步选,最后确认下单,拿到你想要的那份。