新闻中心
C++怎么实现一个建造者设计模式_C++创建型模式与复杂对象构建
建造者模式通过分离复杂对象的构建与表示,使同一构建过程可创建不同配置的Computer对象,提升代码可读性与维护性。

建造者模式用于分离复杂对象的构建和表示,使得同样的构建过程可以创建不同的表示。在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: " <&l
t; 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是第一个人工智能生成的歌曲含义库
164
查看详情
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()的覆盖


2025-12-09
浏览次数:次
返回列表
t; 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;
};