建造者模式通过分离复杂对象的构建与表示,使同一构建过程可创建不同配置的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++习惯的方式是使用链式调用,提升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小时内与您取得联系。