新闻中心

C++怎么实现一个建造者设计模式_C++创建型模式与复杂对象构建

2025-12-09
浏览次数:
返回列表
建造者模式通过分离复杂对象的构建与表示,使同一构建过程可创建不同配置的Computer对象,提升代码可读性与维护性。

c++怎么实现一个建造者设计模式_c++创建型模式与复杂对象构建

建造者模式用于分离复杂对象的构建和表示,使得同样的构建过程可以创建不同的表示。在C++中,当一个类的构造函数参数过多,或者对象的构建步骤较复杂、存在多种变体时,使用建造者模式能显著提升代码可读性和可维护性。

建造者模式的核心思想

将对象的构建逻辑从构造函数中剥离出来,通过一个独立的Builder类逐步配置和组装对象。最终通过build()方法生成目标对象。这种方式避免了“伸缩构造器反模式”(telescoping constructors),即写多个参数不同的构造函数。

比如我们要构建一个复杂的Computer类,包含CPU、内存、硬盘、显卡等组件,不同配置组合多样。

基本实现结构

定义产品类、抽象建造者、具体建造者和指挥者(可选)。

示例代码:

#include <iostream>
#include <string>

// 1. 产品类:Computer
class Computer {
public:
    void setCPU(const std::string& cpu) { m_cpu = cpu; }
    void setRAM(const std::string& ram) { m_ram = ram; }
    void setStorage(const std::string& storage) { m_storage = storage; }
    void setGPU(const std::string& gpu) { m_gpu = gpu; }

    void show() const {
        std::cout << "Computer Config:\n";
        std::cout << "  CPU: " <&lt; m_cpu << "\n";
        std::cout << "  RAM: " << m_ram << "\n";
        std::cout << "  Storage: " << m_storage << "\n";
        std::cout << "  GPU: " << m_gpu << "\n";
    }

private:
    std::string m_cpu;
    std::string m_ram;
    std::string m_storage;
    std::string m_gpu;
};

// 2. 抽象建造者
class ComputerBuilder {
public:
    virtual ~ComputerBuilder() = default;
    virtual void buildCPU() = 0;
    virtual void buildRAM() = 0;
    virtual void buildStorage() = 0;
    virtual void buildGPU() = 0;
    virtual Computer* getComputer() = 0;
};

// 3. 具体建造者:游戏电脑
class GamingComputerBuilder : public ComputerBuilder {
public:
    GamingComputerBuilder() { m_computer = new Computer(); }

    void buildCPU() override { m_computer->setCPU("Intel i9"); }
    void buildRAM() override { m_computer->setRAM("32GB DDR5"); }
    void buildStorage() override { m_computer->setStorage("1TB NVMe SSD"); }
    void buildGPU() override { m_computer->setGPU("RTX 4090"); }

    Computer* getComputer() override {
        Computer* temp = m_computer;
        m_computer = nullptr;
        return temp;
    }

    ~GamingComputerBuilder() {
        delete m_computer;
    }

private:
    Computer* m_computer;
};

// 4. 具体建造者:办公电脑
class OfficeComputerBuilder : public ComputerBuilder {
public:
    OfficeComputerBuilder() { m_computer = new Computer(); }

    void buildCPU() override { m_computer->setCPU("Intel i5"); }
    void buildRAM() override { m_computer->setRAM("16GB DDR4"); }
    void buildStorage() override { m_computer->setStorage("512GB SATA SSD"); }
    void buildGPU() override { m_computer->setGPU("Integrated Graphics"); }

    Computer* getComputer() override {
        Computer* temp = m_computer;
        m_computer = nullptr;
        return temp;
    }

    ~OfficeComputerBuilder() {
        delete m_computer;
    }

private:
    Computer* m_computer;
};

// 5. 指挥者(可选)
class Director {
public:
    void setBuilder(ComputerBuilder* builder) { m_builder = builder; }

    Computer* construct() {
        m_builder->buildCPU();
        m_builder->buildRAM();
        m_builder->buildStorage();
        m_builder->buildGPU();
        return m_builder->getComputer();
    }

private:
    ComputerBuilder* m_builder;
};

使用方式

通过Director控制构建流程,或直接调用Builder的各个步骤。

Songtell Songtell

Songtell是第一个人工智能生成的歌曲含义库

Songtell 164 查看详情 Songtell
int main() {
    Director director;
    GamingComputerBuilder gamingBuilder;
    OfficeComputerBuilder officeBuilder;

    // 构建游戏电脑
    director.setBuilder(&gamingBuilder);
    Computer* gamingPC = director.construct();
    gamingPC->show();

    std::cout << "\n";

    // 构建办公电脑
    director.setBuilder(&officeBuilder);
    Computer* officePC = director.construct();
    officePC->show();

    delete gamingPC;
    delete officePC;

    return 0;
}

现代C++中的流式建造者(Fluent Builder)

更符合C++习惯的方式是使用链式调用,提升API易用性。

class Computer {
public:
    Computer& cpu(const std::string& c) { m_cpu = c; return *this; }
    Computer& ram(const std::string& r) { m_ram = r; return *this; }
    Computer& storage(const std::string& s) { m_storage = s; return *this; }
    Computer& gpu(const std::string& g) { m_gpu = g; return *this; }

    void show() const {
        std::cout << "Custom Computer:\n";
        std::cout << "  CPU: " << m_cpu << "\n";
        std::cout << "  RAM: " << m_ram << "\n";
        std::cout << "  Storage: " << m_storage << "\n";
        std::cout << "  GPU: " << m_gpu << "\n";
    }

private:
    std::string m_cpu;
    std::string m_ram;
    std::string m_storage;
    std::string m_gpu;
};

// 使用示例
/*
Computer myPC;
myPC.cpu("AMD Ryzen 7")
     .ram("32GB")
     .storage("2TB SSD")
     .gpu("RTX 4070")
     .show();
*/

这种风格简洁直观,适合配置类对象,广泛应用于现代C++库设计中。

基本上就这些。根据实际需求选择传统建造者或流式接口,关键是把复杂构建逻辑封装好,让使用者专注配置而非细节。

以上就是C++怎么实现一个建造者设计模式_C++创建型模式与复杂对象构建的详细内容,更多请关注其它相关文章!


# 第一个  # seo网上营销技巧  # 南通网站建设推广价格  # 台州网站建设工作文案  # 莱州建设招标公告网站  # 威海乳山网站seo优化  # 怀化网站优化免费咨询  # 南宁进行网站推广的公司  # 福建seo收费贵吗  # 沧州软文推广营销电话  # 淘宝客营销推广目的  # 解决问题  # 中文网  # 相关文章  # 多个  # 显卡  # 调试器  # 流式  # 运算符  # 链式  # 可选  # 代码可读性  # stream  # ios  # c++  # amd  # ai  # office  # 硬盘  # 电脑 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 外媒分析《GTA6》定价:卖100美元可以但真没必要!  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  Tabulator表格日期时间排序问题及自定义解决方案  CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示  深入理解J*a合成构造器:何时以及为何阻止其生成  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  在Qt QML中通过Python字典动态更新TextEdit内容的教程  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  J*aScript打印功能_j*ascript输出控制  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践  yandex入口引擎手机版 yandex安卓版下载入口  限制HTML日期输入框的日期选择范围  解决Flask中Quill编辑器内容提交失败及TypeError的指南  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  Excel文件在线转换快速入口 Excel在线格式转换网站  Python:递归比较文件夹内容并找出特定类型文件的差异  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  德邦快递查询平台 德邦快递物流信息查询入口  抖音未来赚钱的新趋势 2025年值得关注的变现风口分析  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法  windows10怎么关闭系统提示音_windows10彻底静音设置方法  J*aScript:在map操作中高效处理空数组  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  c++如何使用chrono库处理时间_c++标准库时间与日期操作  2026年CSGO开箱网站推荐 CSGO开箱平台精选  LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  如何在 Excel Online 和 Google 表格中更改日期格式  EMS快递官网app_中国邮政速递物流手机客户端  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现  QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  夸克浏览器图书入口 夸克手机浏览器阅读入口  微信网页版官方快速登录入口 微信网页版网页版账号直达  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  j*a toString()的覆盖 

搜索