C++设计模式之建造者模式:以电脑组装为例

一、建造者模式核心概念

建造者模式是一种创建型设计模式,其核心思想是将复杂对象的构建过程与对象的表示分离,使得同样的构建过程可以创建出不同的对象表示。

在日常生活中,电脑组装就是建造者模式的典型应用:不同用户需要的电脑配置(如办公本、游戏本)差异很大,但组装流程是固定的------都需要安装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再装主板的错误)。

当需要构建包含多个部件、构建流程固定但配置可变的复杂对象时(如电脑、手机、家具等),建造者模式是最优选择之一。

相关推荐
ZouZou老师6 小时前
C++设计模式之工厂方法模式:以家具生产为例
c++·设计模式·工厂方法模式
fish_xk9 小时前
c++中的引用和数组
开发语言·c++
有点。12 小时前
C++ ⼀级 2024 年 03 ⽉
c++
CC.GG13 小时前
【C++】二叉搜索树
java·c++·redis
Savior`L14 小时前
二分算法及常见用法
数据结构·c++·算法
深海潜水员14 小时前
OpenGL 学习笔记 第一章:绘制一个窗口
c++·笔记·学习·图形渲染·opengl
mmz120714 小时前
前缀和问题(c++)
c++·算法·图论
ULTRA??14 小时前
初学protobuf,C++应用例子(AI辅助)
c++·python
旖旎夜光15 小时前
list实现(7)(上)
c++