全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

建造者模式通过分离复杂对象的构建与表示,使同一构建过程可创建不同配置的Computer对象,提升代码可读性与维护性。

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

建造者模式的核心思想

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

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

基本实现结构

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

示例代码:

#include 
#include 

// 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: " << 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的各个步骤。

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++库设计中。

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


# 显卡  # 电脑  # 硬盘  # office  # ai  # amd  # c++  # ios  # stream  # 代码可读性  # 封装  # 构造函数  # 接口  # 对象  # 可选  # 链式  # 流式  # 多个  # 应用于  # 而非  # 装好  # 更符合  # 易用性  # 构建一个 


相关文章: 制作电商网页,电商供应链怎么做?  建站之星2.7模板:企业网站建设与h5定制设计专题  Python路径拼接规范_跨平台处理说明【指导】  油猴 教程,油猴搜脚本为什么会网页无法显示?  网站网页制作专业公司,怎样制作自己的网页?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  网站制作公司,橙子建站是合法的吗?  建站之星安装后如何自定义网站颜色与字体?  网站企业制作流程,用什么语言做企业网站比较好?  网站按钮制作软件,如何实现网页中按钮的自动点击?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  如何通过商城免费建站系统源码自定义网站主题?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  建站之星客服服务时间及联系方式如何?  ,有什么在线背英语单词效率比较高的网站?  网站代码制作软件有哪些,如何生成自己网站的代码?  如何通过VPS搭建网站快速盈利?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  公司网站的制作公司,企业网站制作基本流程有哪些?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  如何快速配置高效服务器建站软件?  如何在Windows虚拟主机上快速搭建网站?  如何打造高效商业网站?建站目的决定转化率  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  ,巨量百应是干嘛的?  IOS倒计时设置UIButton标题title的抖动问题  建站主机是否属于云主机类型?  潮流网站制作头像软件下载,适合母子的网名有哪些?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  利用JavaScript实现拖拽改变元素大小  如何通过.red域名打造高辨识度品牌网站?  建站DNS解析失败?如何正确配置域名服务器?  Swift中循环语句中的转移语句 break 和 continue  制作网站外包平台,自动化接单网站有哪些?  七夕网站制作视频,七夕大促活动怎么报名?  如何在阿里云高效完成企业建站全流程?  相册网站制作软件,图片上的网址怎么复制?  如何用景安虚拟主机手机版绑定域名建站?  如何在橙子建站上传落地页?操作指南详解  建站OpenVZ教程与优化策略:配置指南与性能提升  专业网站建设制作报价,网页设计制作要考什么证?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何通过cPanel快速搭建网站?  ppt制作免费网站有哪些,ppt模板免费下载网站?  C#如何使用XPathNavigator高效查询XML  香港网站服务器数量如何影响SEO优化效果?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。