C++,设计模式,【建造者模式】

文章目录


通俗易懂的建造者模式:手把手教你造电脑

一、现实中的建造者困境

想象你开了一家电脑组装店,客户经常提出这样的需求:

cpp 复制代码
"我要i7处理器+32G内存+RTX4090显卡的电竞主机"
"给我配个i5处理器+16G内存+核显的办公机"
"这个配置能不能换成1TB固态硬盘?"

直接在代码里写N个if-else会变成这样:

cpp 复制代码
Computer buildComputer(string type) {
    Computer c;
    if (type == "gaming") {
        c.cpu = "i7";
        c.ram = "32G";
        //...其他20个部件配置
    } else if (type == "office") {
        //...重复代码
    }
    return c;
}

当需要新增配置项时,所有条件分支都要修改。这时候就需要【建造者模式】登场了!


二、建造者模式核心思想

将复杂对象的构建过程与它的表示分离,让同样的构建过程可以创建不同的表示。

🌰 举个栗子:

就像乐高积木,同样的基础零件(CPU/内存/硬盘),通过不同的搭建顺序(建造者),可以造出赛车(游戏电脑)或房屋(办公电脑)。


三、代码实战:组装电脑

1. 产品类 - 电脑

cpp 复制代码
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. 抽象建造者 - 装机师傅

cpp 复制代码
class ComputerBuilder {
public:
    virtual ~ComputerBuilder() = default;
    virtual void buildCPU() = 0;
    virtual void buildRAM() = 0;
    virtual void buildGPU() = 0;
    virtual Computer* getComputer() = 0;
};

3. 具体建造者 - 电竞主机版

cpp 复制代码
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. 具体建造者 - 办公主机版

cpp 复制代码
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. 指挥官 - 装机总控

cpp 复制代码
class Director {
    ComputerBuilder* builder;
    
public:
    void setBuilder(ComputerBuilder* b) { builder = b; }
    
    Computer* construct() {
        builder->buildCPU();
        builder->buildRAM();
        builder->buildGPU();
        return builder->getComputer();
    }
};

6. 客户端使用

cpp 复制代码
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️⃣ 可视化配置:客户端代码像搭积木一样清晰


五、适用场景速查表

场景 适用建造者模式?
对象构造过程复杂 ✔️
需要不同表示的同类产品 ✔️
构造过程需要分步控制 ✔️
简单对象构造

六、模式全家福

Director ComputerBuilder GamingBuilder OfficeBuilder Computer


七、常见误区提醒

❌ 不要为了用模式而用模式(简单对象不需要)

❌ 当构造过程需要动态变化时,考虑使用工厂模式

✅ 当出现大量if-else构造代码时,就是建造者的信号


八、现实应用案例

  1. Java的StringBuilder
  2. SQL查询构建器(如Hibernate)
  3. LaTeX文档生成器
  4. 软件安装程序的配置向导

掌握建造者模式,就像拿到了对象构造的"乐高说明书"。下次面对复杂对象的组装需求,试着用这个模式解耦你的代码,让系统像模块化积木一样灵活可扩展!

相关推荐
怀揣小梦想31 分钟前
跟着Carl学算法--哈希表
数据结构·c++·笔记·算法·哈希算法·散列表
努力努力再努力wz34 分钟前
【C++进阶系列】:万字详解unordered_set和unordered_map,带你手搓一个哈希表!(附模拟实现unordered_set和unordered_map的源码)
java·linux·开发语言·数据结构·数据库·c++·散列表
加油=^_^=35 分钟前
【C++】哈希表
数据结构·c++·散列表
对纯音乐情有独钟的阿甘36 分钟前
【C++庖丁解牛】哈希表/散列表的设计原理 | 哈希函数
c++·哈希算法·散列表
励志不掉头发的内向程序员37 分钟前
【STL库】哈希表的原理 | 哈希表模拟实现
开发语言·c++·学习·散列表
玩镜的码农小师兄38 分钟前
[从零开始面试算法] (04/100) LeetCode 136. 只出现一次的数字:哈希表与位运算的巅峰对决
c++·算法·leetcode·面试·位运算·hot100
懂得节能嘛.1 小时前
【设计模式】Java规则树重构复杂业务逻辑
java·开发语言·设计模式
tan77º1 小时前
【项目】基于多设计模式下的同步&异步日志系统 - 项目介绍与前置知识
linux·c++·设计模式
给大佬递杯卡布奇诺1 小时前
FFmpeg 基本API avcodec_open2函数内部调用流程分析
c++·ffmpeg·音视频
进击的圆儿2 小时前
高并发内存池项目开发记录 - 02
开发语言·c++·实战·项目·内存池