2023-6-13-第四式建造者模式

news2024/11/18 15:51:52


🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之建造者模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、建造者模式实现
  • 🎉三、模块之间的关系
  • 🐱‍🚀四、注意事项
  • 🎂五、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

建造者模式是一种创建型设计模式,它使得对象的构建与表示分离,从而可以通过相同的构建过程创建不同的表示。这种模式适用于需要创建复杂对象,且对象的构建过程比较固定但存在多个组合方式的情况。通过使用建造者模式,可以将对象的构建过程抽象出来,使得相同的构建过程可以用于创建不同类型的对象。同时,建造者模式还可以避免创建对象时出现参数错误或者遗漏等问题,提高了代码可维护性和可读性。


🐱‍🐉二、建造者模式实现

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

#include <string>

// Product类,表示要构建的复杂对象
class Product {
public:
    void setPartA(const std::string& partA) { m_partA = partA; }
    void setPartB(const std::string& partB) { m_partB = partB; }
    void setPartC(const std::string& partC) { m_partC = partC; }
    std::string getParts() const { return m_partA + " " + m_partB + " " + m_partC; }
private:
    std::string m_partA;
    std::string m_partB;
    std::string m_partC;
};

// Builder类,抽象出产品的构造过程
class Builder {
public:
    virtual void buildPartA() = 0;
    virtual void buildPartB() = 0;
    virtual void buildPartC() = 0;
    virtual Product getProduct() = 0;
};

// ConcreteBuilder类,具体实现Builder接口,定义产品构造方法
class ConcreteBuilder : public Builder {
public:
    ConcreteBuilder() : m_product(new Product()) {}
    void buildPartA() override { m_product->setPartA("Part A"); }
    void buildPartB() override { m_product->setPartB("Part B"); }
    void buildPartC() override { m_product->setPartC("Part C"); }
    Product getProduct() override { return *m_product; }
private:
    std::shared_ptr<Product> m_product;
};

// Director类,使用Builder接口完成产品的构造过程
class Director {
public:
    Director(std::shared_ptr<Builder> builder) : m_builder(builder) {}
    void construct() {
        m_builder->buildPartA();
        m_builder->buildPartB();
        m_builder->buildPartC();
    }
private:
    std::shared_ptr<Builder> m_builder;
};

// 测试
int main() {
    std::shared_ptr<Builder> builder = std::make_shared<ConcreteBuilder>();
    Director director(builder);
    director.construct();
    Product product = builder->getProduct();
    std::string parts = product.getParts(); // "Part A Part B Part C"
    return 0;
}

在这个示例中,Product类表示要构建的复杂对象,具有多个部分(Part)。Builder类抽象出了构造过程,并定义了一组构造方法。ConcreteBuilder类实现了Builder接口,定义了具体的产品构造方法。Director类使用Builder接口完成产品的构造过程。最后,在main函数中可以通过Director和Builder来创建和获取Product对象。


🎉三、模块之间的关系

建造者模式中包含以下几个关键模块:

  1. Product类(产品类):表示要构建的复杂对象,通常具有多个部分。

  2. Builder类(抽象建造者类):抽象出产品的构造过程,并定义了一组构造方法。通常是一个接口或抽象类。

  3. ConcreteBuilder类(具体建造者类):实现了Builder接口,定义了具体的产品构造方法。

  4. Director类(导演类):使用Builder接口完成产品的构造过程。通常不直接与Product交互,而是通过Builder来创建和获取Product对象。

在建造者模式中,Product类表示最终要构建的复杂对象,Builder类抽象出了对象的构建过程,并定义了一组构造方法,ConcreteBuilder类实现了Builder接口,定义了具体的产品构造方法,Director类使用Builder接口完成对象的构建过程,同时也可以控制构建过程的顺序和方式。通常情况下,Director不会直接与Product交互,而是通过Builder来创建和获取Product对象。通过这些模块之间的协作,可以将对象的构建过程与表示分离,使得相同的构建过程可以用于创建不同类型的对象。


🐱‍🚀四、注意事项

使用建造者模式时需要注意以下几点:

  1. Builder接口的设计:Builder接口应该抽象出产品的构造过程,并定义一组构造方法。如果Builder接口设计不合理,可能会导致构建过程复杂或存在重复代码。

  2. ConcreteBuilder类的实现:ConcreteBuilder类应该实现Builder接口,同时定义具体的产品构造方法。如果ConcreteBuilder类没有正确地实现Builder接口,可能会导致构建过程错误或者无法创建正确的产品对象。

  3. Director类的使用:Director类应该使用Builder接口完成产品的构造过程,并负责控制构建的顺序和方式。如果Director类使用不当,可能会导致构建过程不可控或者无法满足需求。

  4. Product类的设计:Product类表示要构建的复杂对象,通常具有多个部分。因此,在设计Product类时需要考虑到各个部分之间的关系和依赖性,以及如何表示这些部分。

  5. 构造方法的调用顺序:在使用建造者模式时,需要确保Builder接口中定义的构造方法被正确地调用,否则可能会导致构建过程出错或者无法创建正确的产品对象。

  6. 简化构造器:建造者模式可以通过简化构造器来避免创建对象时出现参数错误或者遗漏等问题,提高了代码可维护性和可读性。因此,应该尽量使用建造者模式来创建复杂对象,而不是直接使用构造器。


🎂五、使用场景

建造者模式适用于以下场景:

  1. 需要创建复杂对象:如果需要创建的对象比较复杂,通常由多个部分组成且构建过程比较固定,那么可以使用建造者模式,将对象的构建过程与表示分离,从而使得相同的构建过程可以用于创建不同类型的对象。

  2. 需要避免参数错误或者遗漏等问题:在使用构造器直接创建对象时,可能会存在参数错误或者遗漏等问题。通过使用建造者模式,可以将构建过程抽象出来,从而可以避免这些问题,并提高代码可维护性和可读性。

  3. 需要控制对象构建过程的顺序和方式:通过使用Director类来控制对象构建过程的顺序和方式,可以使得构建过程更加灵活和可控,从而满足不同的需求。

  4. 需要创建不同表示的对象:通过使用Builder类,可以将对象的表示与构建过程分离,从而可以通过相同的构建过程创建不同表示的对象。例如,在不同的平台上创建相同的对象就可以使用这种方法。

  5. 需要简化构造器:通过使用建造者模式,可以将构造方法简化,从而提高了代码的可维护性和可读性。特别是在需要创建复杂对象时,使用建造者模式可以使构造方法更加简洁和易于理解。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

  本文讲了关于构造者模式的一些内容






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Openharmony使用hdc提效

告别串口卡顿调试&#x1f438;hdc增效大法&#x1f438;&#xff0c;工作环境主要是Linux&#xff0c;所以主要是介绍Linux环境下使用喔~ 文章目录 HDC1.1 简单介绍1.2 搭建环境1.2.1 设备机1.2.2 pc机1.2.3 操作 AuthorDateVersionDescription陈梓归2023-06-13V1.0第一个版本…

详解模板模式

目录 1.概述 2.实际业务场景示例 2.1.需求和实现思路 2.1.完整代码实现 1.概述 模板模式是一种常用的设计模式&#xff0c;它定义了一个操作中的算法的骨架&#xff0c;将某些步骤延迟到子类中实现。模板模式使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤…

【ubuntu】vscode上jupter notebook的使用

1.安装vscode 2.安装python环境和插件 系统要有Python环境&#xff1a;conda install python 或者 pip都可以 在vsode里安装如下插件 3.安装jupter conda install jupyter notebook 安装完之后试着打开 输入jupyter note 打开才行&#xff0c;如果安装失败&#xff0c;就…

【IoT】降低硬件创业风险的 6 个小建议

目录 第一个是聘用多名独立的工程师 第二个是从小批量开始做 第三个是使用电子模块 第四个是充分利用制造商资源 第五个是在构建产品之前先建立客户群体 第六个是预售你的产品 无论你提前做了多么充分的准备。 将全新的硬件产品推向市场就一定会引入风险。 这里的全新是…

AntDB 企业增强特性介绍——读写分离

面对日益增加的系统访问量&#xff0c;读写分离可以充分利用备机资源&#xff0c;有效地提升数据库的吞吐量。过去常用的手段是通过应用层来控制数据库的读写流量。 AntDB 通过在 Coordinator 组件的 SQL 解析路由层增加对读写流量的精确访问控制且对应用透明&#xff0c;做到…

CMU-Multimodal SDK Version 1.2.0(mmsdk)Windows配置与使用+pytorch代码demo

最近做实验要用到CMU-MOSI数据集&#xff0c;网上搜到的教程很少&#xff0c;经过一天时间的探索&#xff0c;最终成功安装配置数据集&#xff0c;这篇文章完整地整理一下该数据集的下载与使用方法。 配置环境&#xff1a; window10&#xff0c;anaconda 1. 需要下载的内容 …

DVWA-15.Open HTTP Redirect

OWASP将其定义为&#xff1a; 当 Web 应用程序接受不受信任的输入时&#xff0c;可能会导致 Web 应用程序将请求重定向到不受信任输入中包含的 URL&#xff0c;则可能会出现未经验证的重定向和转发。通过修改恶意站点的不受信任的 URL 输入&#xff0c;攻击者可以成功发起网络钓…

NeRF 模型评价指标PSNR,MS-SSIM, LPIPS 详解和python实现

PSNR&#xff1a; PSNR&#xff08;Peak Signal-to-Noise Ratio&#xff0c;峰值信噪比&#xff09;是一种常用于衡量图像或视频质量的指标。它用于比较原始图像与经过处理或压缩后的图像之间的差异。PSNR通过计算原始图像与重建图像之间的均方误差&#xff08;Mean Squared E…

python爬各平台评论并数据分析——数据采集、评论情绪分析、新闻热度

一、爬取数据 小问题汇总 1.python之matplotlib使用系统字体 用于解决python绘图中&#xff0c;中文字体显示问题 2.cookie与视频页面id&#xff08;b站、微博等&#xff09;查看 F12打开网页开发者模式&#xff0c;然后F5刷新&#xff0c;进入控制台中的网络&#xff0c;…

618什么值得囤?这些刚需数码好物必囤!

​目前&#xff0c;618活动已经正式拉开帷幕了&#xff0c;相信很多小伙伴已经按耐不住想要入手了&#xff01;但如果目前还没什么头绪&#xff0c;不知道买什么的话&#xff0c;现在就不妨来抄一下作业吧&#xff01;近期我整理了一份618数码好物清单&#xff0c;都是精心挑选…

插件化工程R文件瘦身技术方案 | 京东云技术团队

随着业务的发展及版本迭代&#xff0c;客户端工程中不断增加新的业务逻辑、引入新的资源&#xff0c;随之而来的问题就是安装包体积变大&#xff0c;前期各个业务模块通过无用资源删减、大图压缩或转上云、AB实验业务逻辑下线或其他手段在降低包体积上取得了一定的成果。 在瘦…

Window域控环境之账号误删恢复

文章目录 背景信息问题分析操作步骤 文章内容已做脱敏处理 背景信息 8&#xff1a;30&#xff0c;收到联络反馈客户误删除部门领导域控账户&#xff0c;希望紧急实施VM整机恢复工作。收到联络时&#xff0c;我是觉得这个事情挺严重的。毕竟现在域控账号是企业里面重要的身份与…

深度学习数据处理中,标量、向量、张量的区别与联系

计算机中的标量机是指只是一个数一个数地进行计算的加工处理方法&#xff0c;区别于向量机能够对一批数据同时进行加工处理。标量机比向量机的运算速度慢&#xff0c;因此&#xff0c;向量机更适合于演算数据量多的大型科学、工程计算问题。 计算机可以进行数值计算&#xff0c…

5.2.11 IP分组的转发(二)IP分组转发算法

5.2.11 IP分组的转发&#xff08;二&#xff09;IP分组转发算法 我们前面已经了解了路由器的结构以及直接交付和间接交付的概念&#xff0c;明白了路由器会根据路由协议生成路由表再根据路由表生成转发表&#xff0c;当路由器收到一个待转发的IP分组以后&#xff0c;会根据分组…

Background-1 基础知识 sqli-Labs Less1-Less-4

文章目录 一、Less-1二、Less-2三、Less-3四、Less-4总结 一、Less-1 http://sqli:8080/Less-1/?id1在第一关我们可以尝试增加一个单引号进行尝试 http://sqli:8080/Less-1/?id1错误显示如下&#xff1a; near 1 LIMIT 0,1 at line 1推测语法的结构 select *from where **…

2009年iMac装64位windows7

单位领导会花屏的iMac&#xff08;24寸 2009年初版&#xff09;我捡来用&#xff0c;应该大约是在2020年安装了32位windows7&#xff0c;发现不安装显卡驱动便不会花屏死机&#xff0c;于是就当简单的上网机用着&#xff0c;毕竟iMac的显示屏还是蛮不错的。现在要使用的1个软件…

linux中那些常用好玩的命令

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文是专栏【linux基本功-基础命令实战】的第66篇文章&#xff0c;今天要分享是多个命令&#xff0c;在工作中不常用&#xff0c;但好玩。 专栏地址&#xff1a;[linux基本功-基础命令专栏] &#xff0c…

华为OD机试真题B卷 Java 实现【二叉树的所有路径】,附详细解题思路

一、题目描述 给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 二、思路与算法 最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时&#xff0c;我们需要考虑当前的节点以及它的孩子节点。 如果当前节点不是…

DAY 77 [ Ceph ] 基本概念、原理及架构

前言 在实现容器化的初期&#xff0c;计划使用 Ceph 作为容器的存储。都说存储是虚拟化之母&#xff0c;相对容器来说&#xff0c;存储也起到了至关重要的作用。 选用 Ceph 作为容器化存储理由如下&#xff1a; 方便后期横向扩展&#xff1b;Ceph能够同时支持快存储、对象存…

MM32F3273G8P火龙果开发板MindSDK开发教程15 - 获取msa311加速器的方向改变事件

MM32F3273G8P火龙果开发板MindSDK开发教程15 - 获取msa311加速器的方向改变事件 1、功能描述 类似手机里横屏竖屏检测&#xff0c;当方向发生变化时&#xff0c;横屏竖屏自动切换。 当msa311方向改变时&#xff0c;会产生中断&#xff0c;然后从寄存器Reg 0x0C(Orientation _…