C++如何实现建造者 C++建造者模式的设计

建造者模式与工厂模式的区别在于,工厂模式用于创建不同类型的对象,而建造者模式专注于构建复杂对象的不同部分。1. 工厂模式通常一步返回完整对象;2. 建造者模式允许逐步构建并控制过程;3. 建造者适用于对象构建复杂、需灵活配置组件的情况;4. 建造者避免构造函数臃肿,提高可维护性;5. c++++中通过在析构函数中释放内存或使用智能指针防止内存泄漏。

C++如何实现建造者 C++建造者模式的设计

C++建造者模式的核心在于将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这在对象构造过程复杂,且需要灵活配置不同组件时非常有用。

C++如何实现建造者 C++建造者模式的设计

解决方案

C++如何实现建造者 C++建造者模式的设计

建造者模式通过定义一个抽象的建造者类(Builder),以及具体的建造者类(ConcreteBuilder)来实现。抽象建造者定义了构建产品各个部分的接口,而具体建造者则负责实现这些接口,并最终构建出产品。一个指挥者类(Director)负责调用建造者来按照特定的顺序构建产品。

立即学习“C++免费学习笔记(深入)”;

C++如何实现建造者 C++建造者模式的设计

以下是一个C++建造者模式的简单示例:

#include #include // 产品类class Computer {public:    void setCPU(const std::string& cpu) { cpu_ = cpu; }    void setRAM(const std::string& ram) { ram_ = ram; }    void setStorage(const std::string& storage) { storage_ = storage; }    void display() const {        std::cout << "CPU: " << cpu_ << std::endl;        std::cout << "RAM: " << ram_ << std::endl;        std::cout << "Storage: " << storage_ <setCPU("Intel i9"); }    void buildRAM() override { computer_->setRAM("32GB"); }    void buildStorage() override { computer_->setStorage("1TB SSD"); }    Computer* getComputer() override { return computer_; }    ~GamingComputerBuilder() override {        if(computer_){            delete computer_;            computer_ = nullptr;        }    }};class OfficeComputerBuilder : public ComputerBuilder {public:    void buildCPU() override { computer_->setCPU("Intel i5"); }    void buildRAM() override { computer_->setRAM("8GB"); }    void buildStorage() override { computer_->setStorage("256GB SSD"); }    Computer* getComputer() override { return computer_; }    ~OfficeComputerBuilder() override {        if(computer_){            delete computer_;            computer_ = nullptr;        }    }};// 指挥者class Director {public:    void construct(ComputerBuilder* builder) {        builder->buildCPU();        builder->buildRAM();        builder->buildStorage();    }};int main() {    Director director;    GamingComputerBuilder gamingBuilder;    OfficeComputerBuilder officeBuilder;    director.construct(&gamingBuilder);    Computer* gamingComputer = gamingBuilder.getComputer();    std::cout << "Gaming Computer:" <display();    delete gamingComputer;    director.construct(&officeBuilder);    Computer* officeComputer = officeBuilder.getComputer();    std::cout << "nOffice Computer:" <display();    delete officeComputer;    return 0;}

建造者模式与工厂模式的区别是什么?

建造者模式和工厂模式都用于创建对象,但它们的应用场景不同。工厂模式主要用于创建不同类型的对象,而建造者模式则专注于构建一个复杂对象的不同部分。工厂模式通常返回一个已经完整构建好的对象,而建造者模式允许客户端逐步构建对象,并控制构建过程。可以这么理解,工厂模式是“一步到位”,而建造者模式是“分步构建”。

何时应该使用建造者模式?

当对象的构建过程非常复杂,涉及多个步骤,并且需要灵活配置不同组件时,就应该考虑使用建造者模式。 比如,构建一个汽车,需要先构建发动机、车身、轮胎等部件,然后将它们组装起来。不同的汽车可能需要不同的发动机、车身和轮胎。使用建造者模式可以很好地处理这种情况。 另外,如果构造函数的参数过多,使用建造者模式可以避免构造函数过于臃肿,提高代码的可读性和可维护性。

C++中如何避免建造者模式中的内存泄漏?

在C++中使用建造者模式时,需要特别注意内存管理,避免内存泄漏。在上面的例子中,ComputerBuilder 维护了 Computer* computer_ 指针。为了防止内存泄漏,需要在具体建造者的析构函数中释放 computer_ 指向的内存。 此外,还需要注意在 getComputer() 方法返回 computer_ 指针后,客户端代码需要负责释放该指针指向的内存。 如果使用智能指针(例如 std::unique_ptrstd::shared_ptr),可以更容易地管理内存,避免手动释放内存的麻烦。例如,可以将 computer_ 定义为 std::unique_ptr,这样当 ComputerBuilder 对象销毁时,Computer 对象也会自动销毁。

以上就是C++如何实现建造者 C++建造者模式的设计的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1463659.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何构建一个高可用的Node.js应用,并处理进程崩溃与重启?
上一篇 2026年5月10日 11:12:20
如何使用Css Flex 弹性布局创建分页导航条
下一篇 2026年5月10日 11:12:22

相关推荐

  • 使用 Python LXML 和 XPath 稳健提取 HTML 链接文本教程

    本教程详细介绍了如何使用 python 的 lxml 库和 xpath 表达式从 html 链接中高效且稳健地提取文本内容。文章强调了在构建 xpath 时,应优先考虑使用元素属性(如 class)而非依赖脆弱的 dom 结构路径,并结合 //text() 函数来准确捕获目标文本。通过具体的代码示例…

    2026年5月10日
    000
  • 在 Laravel Eloquent 中高效查询 JSON 数组字段的教程

    本文旨在解决 laravel eloquent 在查询 json 数组字段时遇到的路径解析问题。当需要根据 json 数组中特定索引的值进行筛选时,eloquent 的 `wherejsondoesntcontain` 或 `where` 方法可能因生成错误的 sql 路径(例如 `$.&#8221…

    2026年5月10日
    000
  • Telegram Bot 启动时定制化操作与信息获取指南

    本文深入探讨了在 `python-telegram-bot` v20 中,如何在 bot 启动时执行定制化操作和获取信息。重点介绍了 `applicationbuilder` 的 `post_init_handler` 回调函数,展示了如何在其中安全地进行 telegram api 调用,并明确指出…

    2026年5月10日
    100
  • 优化JavaScript搜索过滤器:添加无匹配结果提示与最佳实践

    优化JavaScript搜索过滤器:添加无匹配结果提示与最佳实践优化JavaScript搜索过滤器:添加无匹配结果提示与最佳实践优化JavaScript搜索过滤器:添加无匹配结果提示与最佳实践优化JavaScript搜索过滤器:添加无匹配结果提示与最佳实践

    本文详细介绍了如何使用原生javascript实现一个功能完善的搜索过滤器,并重点解决在没有匹配项时显示“无匹配结果”提示的需求。教程涵盖了html结构、css样式以及核心javascript逻辑,并提供了代码优化建议,包括使用`display: none`进行元素隐藏以及通过检查过滤结果数量来动态…

    2026年5月10日 用户投稿
    000
  • Golang微服务如何实现动态扩缩容

    Go微服务通过容器化与Kubernetes实现动态扩缩容,需具备无状态设计、健康检查与优雅关闭;利用HPA基于CPU或Prometheus业务指标自动调整Pod副本数,结合Service与Ingress实现负载均衡,由平台完成弹性调度。 Go语言编写的微服务实现动态扩缩容,核心依赖于容器化部署与编排…

    2026年5月10日
    000
  • 解决Laravel中日期数据存储为‘0000-00-00’的常见问题

    在laravel应用中,当从前端日期选择器接收到的日期数据在数据库中意外地存储为’0000-00-00’时,这通常是由于laravel的模型批量赋值保护机制所致。本文将深入探讨这一问题,并提供一个简洁有效的解决方案:通过正确配置eloquent模型的$fillable属性,确…

    2026年5月10日
    000
  • C++在移动应用程序开发中的潜力:人才和资源

    c++++在移动开发中潜力巨大,原因在于:庞大的开发者社区和丰富的学习资源;高效内存管理和低级控制,带来卓越性能;wora模型,一次编写即可跨安卓、ios、windows运行;广泛用于游戏引擎开发,低延迟和资源管理功能满足高性能游戏需求。 C++在移动应用程序开发中的潜力:人才和资源 C++ 以其高…

    2026年5月10日
    000
  • 深入理解Go语言中多协程与通道的并发模式

    本文探讨Go语言中多个协程同时从一个通道接收数据或向其发送数据的行为。Go语言规范并未明确规定调度顺序,其行为由运行时调度器决定,因此具有非确定性。文章强调了使用通道参数、避免同一协程读写同一通道以及谨慎使用缓冲通道等最佳实践,并通过具体代码示例展示了多写一读和一写多读的并发模式,帮助开发者构建健壮…

    2026年5月10日
    100
  • C++23的deducing this是什么_C++中允许在成员函数中推导*this的类型

    C++23引入deducing this,允许成员函数通过auto推导*this的类型,简化左值/右值、const/non-const重载。语法为void func(this auto& self),可统一处理不同对象形式,适用于泛型设计如日志、链式调用等场景,提升代码简洁性与通用性。 C+…

    2026年5月10日
    000
  • C++ forward_list单向链表用法_C++轻量级链表的插入与删除

    forward_list是C++ STL中的单向链表,内存开销小,适用于频繁插入删除且无需反向遍历的场景。它定义于头文件,仅支持前向迭代,不提供size()方法(C++11起可选),需用distance(begin(), end())计算长度。其节点只含下一节点指针,插入删除操作高效,时间复杂度为O…

    2026年5月10日
    200
  • js如何实现下拉菜单的展开和收缩

    下拉菜单的展开和收缩可以通过css和javascript实现。1)使用css的:hover伪类可以简单实现,但不适合触摸屏。2)javascript方法通过toggledropdown函数和点击事件监听器实现更灵活的控制,适合触摸屏和现代web应用。 实现下拉菜单的展开和收缩在JavaScript中…

    2026年5月10日
    000
  • 实现C#中图片.BYTE[]和base64string的转换方法的详解

    下面小编就为大家带来一篇c#中图片.byte[]和base64string的转换方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 在C#中      图片到byte[]再到base64string的转换: Bitmap bmp = new Bitmap(filepa…

    用户投稿 2026年5月10日
    000
  • C++ 框架选择指南:深入浅出剖析关键考量因素

    C++ 框架选择指南:关键考量因素深入浅出 在当今快节奏的软件开发环境中,选择合适的 C++ 框架至关重要,因为它可以显着影响应用程序的效率、可维护性和可扩展性。本文提供了全面的指南,旨在帮助开发人员选择最适合其项目的 C++ 框架。 关键考虑因素 1. 项目类型和规模: 立即学习“C++免费学习笔…

    2026年5月10日
    000
  • c++ map如何插入和查找键值对_c++ map插入与查找方法

    std::map基于红黑树实现,支持自动排序,插入和查找时间复杂度为O(log n)。1. 插入可用insert、下标[]或emplace,其中emplace效率更高;2. 查找推荐使用find或count,避免用下标导致意外插入;3. 示例展示了三种插入与两种查找方法的正确使用场景。 在C++中,…

    2026年5月10日
    000
  • 怎样用Python处理视频流?OpenCV帧操作详解

    怎样用Python处理视频流?OpenCV帧操作详解怎样用Python处理视频流?OpenCV帧操作详解怎样用Python处理视频流?OpenCV帧操作详解怎样用Python处理视频流?OpenCV帧操作详解

    python和opencv处理视频流的核心在于将视频拆分为帧并逐帧处理。步骤包括:1. 捕获视频源,使用cv2.videocapture()打开摄像头或视频文件;2. 循环读取每一帧并判断是否成功获取;3. 对每一帧进行图像处理操作,如灰度化、模糊、边缘检测等;4. 显示或保存处理后的帧;5. 最后…

    2026年5月10日 用户投稿
    000
  • 如何用Golang实现第一个CLI工具 详解cobra库创建命令行应用

    如何用Golang实现第一个CLI工具 详解cobra库创建命令行应用如何用Golang实现第一个CLI工具 详解cobra库创建命令行应用如何用Golang实现第一个CLI工具 详解cobra库创建命令行应用如何用Golang实现第一个CLI工具 详解cobra库创建命令行应用

    用golang实现cli工具可借助cobra库快速完成。1. 安装cobra:使用go install github.com/spf13/cobra-cli@latest;2. 初始化项目结构:运行cobra init –pkg-name mycli生成基础代码;3. 添加子命令:执行c…

    2026年5月10日 用户投稿
    000
  • JavaScriptTC39标准_JavaScript语言规范解读

    TC39通过五阶段流程推动JavaScript发展,确保语言在兼容基础上持续进化,近年引入可选链、空值合并、顶级await等特性,并推进记录与元组、装饰器等提案,开发者可通过GitHub跟踪进展并用Babel实验新功能。 JavaScript语言的发展离不开TC39组织的推动。TC39是负责ECMA…

    2026年5月10日
    000
  • ThinkPHP框架怎么使用验证器_ThinkPHP数据验证规则与场景配置

    ThinkPHP验证器用于数据校验,提升系统健壮性。通过继承thinkValidate创建自定义验证器,如UserValidate定义用户名、邮箱、密码规则及提示信息;在控制器中实例化并调用check方法进行验证,失败返回错误信息。内置丰富规则:require(必填)、number/integer(…

    2026年5月10日
    100
  • C++如何实现函数重载_C++函数名相同但参数不同的编程技巧

    函数重载允许相同函数名定义多个函数,需参数列表不同,如参数类型、个数或顺序不同,返回类型不影响重载。例如void print(int)与void print(double)可共存,编译器根据实参选择匹配版本,提升代码可读性与复用性,但应避免类型转换歧义和过度使用影响维护性。 在C++中,函数重载是一…

    2026年5月10日
    000
  • C++ 函数库详解:系统功能外延的未来发展趋势

    c++++ 函数库提供代码扩展,无需修改基础代码。其类型包括标准函数库 (stl)、第三方函数库和自定义函数库。函数库的好处包括代码重用、功能扩展和代码抽象。 C++ 函数库详解:系统功能外延的未来发展趋势 函数库是 C++ 编程中的重要组成部分,它们可扩展代码功能,无需修改基础代码。通过了解函数库…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信