文章目录
通俗易懂的建造者模式:手把手教你造电脑
一、现实中的建造者困境
想象你开了一家电脑组装店,客户经常提出这样的需求:
"我要i7处理器+32G内存+RTX4090显卡的电竞主机"
"给我配个i5处理器+16G内存+核显的办公机"
"这个配置能不能换成1TB固态硬盘?"
直接在代码里写N个if-else会变成这样:
Computer buildComputer(string type) {
Computer c;
if (type == "gaming") {
c.cpu = "i7";
c.ram = "32G";
//...其他20个部件配置
} else if (type == "office") {
//...重复代码
}
return c;
}
当需要新增配置项时,所有条件分支都要修改。这时候就需要【建造者模式】登场了!
二、建造者模式核心思想
将复杂对象的构建过程与它的表示分离,让同样的构建过程可以创建不同的表示。
🌰 举个栗子:
就像乐高积木,同样的基础零件(CPU/内存/硬盘),通过不同的搭建顺序(建造者),可以造出赛车(游戏电脑)或房屋(办公电脑)。
三、代码实战:组装电脑
1. 产品类 - 电脑
class Computer {
public:
void setCPU(string cpu) { this->cpu = cpu; }
void setRAM(string ram) { this->ram = ram; }
void setGPU(string gpu) { this->gpu = gpu; }
void showConfig() {
cout << "【电脑配置】\n"
<< "CPU: "<< cpu << "\n"
<< "内存: "<< ram << "\n"
<< "显卡: "<< gpu << endl;
}
private:
string cpu = "i3";
string ram = "8G";
string gpu = "集成显卡";
};
2. 抽象建造者 - 装机师傅
class ComputerBuilder {
public:
virtual ~ComputerBuilder() = default;
virtual void buildCPU() = 0;
virtual void buildRAM() = 0;
virtual void buildGPU() = 0;
virtual Computer* getComputer() = 0;
};
3. 具体建造者 - 电竞主机版
class GamingComputerBuilder : public ComputerBuilder {
Computer* computer = new Computer();
public:
void buildCPU() override { computer->setCPU("i7-13700K"); }
void buildRAM() override { computer->setRAM("32G DDR5"); }
void buildGPU() override { computer->setGPU("RTX 4090"); }
Computer* getComputer() override { return computer; }
};
4. 具体建造者 - 办公主机版
class OfficeComputerBuilder : public ComputerBuilder {
Computer* computer = new Computer();
public:
void buildCPU() override { computer->setCPU("i5-12400"); }
void buildRAM() override { computer->setRAM("16G DDR4"); }
void buildGPU() override { /* 使用核显 */ }
Computer* getComputer() override { return computer; }
};
5. 指挥官 - 装机总控
class Director {
ComputerBuilder* builder;
public:
void setBuilder(ComputerBuilder* b) { builder = b; }
Computer* construct() {
builder->buildCPU();
builder->buildRAM();
builder->buildGPU();
return builder->getComputer();
}
};
6. 客户端使用
int main() {
Director director;
// 组装电竞主机
director.setBuilder(new GamingComputerBuilder());
Computer* gamingPC = director.construct();
gamingPC->showConfig();
// 组装办公主机
director.setBuilder(new OfficeComputerBuilder());
Computer* officePC = director.construct();
officePC->showConfig();
return 0;
}
四、模式优势解析
1️⃣ 解耦复杂度:把20个配置项分散到不同建造者中
2️⃣ 开闭原则:新增配置项只需加建造者,不改现有代码
3️⃣ 去重复:组装流程统一在Director中管理
4️⃣ 可视化配置:客户端代码像搭积木一样清晰
五、适用场景速查表
场景 | 适用建造者模式? |
---|---|
对象构造过程复杂 | ✔️ |
需要不同表示的同类产品 | ✔️ |
构造过程需要分步控制 | ✔️ |
简单对象构造 | ❌ |
六、模式全家福
七、常见误区提醒
❌ 不要为了用模式而用模式(简单对象不需要)
❌ 当构造过程需要动态变化时,考虑使用工厂模式
✅ 当出现大量if-else构造代码时,就是建造者的信号
八、现实应用案例
- Java的StringBuilder
- SQL查询构建器(如Hibernate)
- LaTeX文档生成器
- 软件安装程序的配置向导
掌握建造者模式,就像拿到了对象构造的"乐高说明书"。下次面对复杂对象的组装需求,试着用这个模式解耦你的代码,让系统像模块化积木一样灵活可扩展!