构建器模式-C++实现

构建器模式是一种创建型设计模式,主要用于构建需要多个步骤和复杂参数的对象。该模式可以把对象的构建过程和它的表示进行分离,使得同样的构建过程可以有不同的表示。

比如说我们要建造一座房子,这个房子的类型有很多种,比如石头房、茅草房,但是它们的构造过程是相同的,我们都需要构造一个天花板、一扇门、两扇窗户。

构建器分为四个角色:

  • 产品:需要创建的复杂对象,该对象包含多个属性和部件。上述例子提到的“房子”。
  • 抽象构建器:定义了创建产品的各个步骤以及组装产品的方法。上述例子提到的创建天花板、创建门、创建窗户。
  • 具体构建器:实现了抽象构建器定义的方法。
  • 指导者:负责调用具体构建器,按照一定的顺序执行构建步骤,创建产品。比如上述例子中我们先构建天花板、再构建门、最后构建窗户,这是创建一座房子需要的步骤。

构建器模式的主要思想是将构建过程拆分为多个步骤来创建一个复杂的对象,通过这种方式,可以灵活地组合步骤,以创建不同的产品。

举一个例子:

假设我们现在要创建一辆车,它有三个步骤:创建方向盘、创建车轮、创建刹车。三个步骤的顺序:1、构建方向盘 2、构建四个车轮 3、构建刹车。

// 产品 - 车
class Car
{
public:// 构建方向盘void CreateSteerWheel(const std::string& _brand){std::cout << "构建方向盘: " << _brand << "品牌" << std::endl;steer_wheel_ = _brand;}// 构建车轮void CreateWheel(const std::string& _brand){std::cout << "构建车轮: " << _brand << "品牌" << std::endl;wheel_.emplace_back(_brand);}// 构建刹车void CreateBrake(const std::string& _brand){std::cout << "构建刹车: " << _brand << "品牌" << std::endl;brake_ = _brand;}// 开车void Drive(){std::cout << "启动" << std::endl;}private:std::string steer_wheel_;std::vector<std::string> wheel_;std::string brake_;
};// 抽象构建器
class CarBuilder
{
public:virtual ~CarBuilder() {}virtual void BuildSteerWheel() = 0;virtual void BuildWheel() = 0;virtual void BuildBrake() = 0;virtual std::shared_ptr<Car> GetResult() = 0;
};// 具体构建器
class Benz: public CarBuilder
{
public:Benz(){car_ = std::make_shared<Car>();}virtual void BuildSteerWheel() override{car_->CreateSteerWheel("米其林");}virtual void BuildWheel() override{car_->CreateWheel("米其林");}virtual void BuildBrake() override{car_->CreateBrake("米其林");}virtual std::shared_ptr<Car> GetResult() override{if (car_)return car_;}private:std::shared_ptr<Car> car_;
};// 指导者
class CarDirector
{
public:std::shared_ptr<Car> Build(std::shared_ptr<CarBuilder> _car_build){// 构建步骤:1、构建方向盘 2、构建四个车轮 3、构建刹车_car_build->BuildSteerWheel();for (int i = 0; i < 4; i++){_car_build->BuildWheel();}_car_build->BuildBrake();return _car_build->GetResult();}
};

测试:

void TestBuilder()
{// 指导者std::shared_ptr<CarDirector> director = std::make_shared<CarDirector>();// 构建器std::shared_ptr<CarBuilder> car_build = std::make_shared<Benz>();// 指导者去调用具体构建器std::shared_ptr<Car> car = director->Build(car_build);car->Drive();
}

输出:

构建方向盘: 米其林品牌
构建车轮: 米其林品牌
构建车轮: 米其林品牌
构建车轮: 米其林品牌
构建车轮: 米其林品牌
构建刹车: 米其林品牌
启动

构建器模式遵循以下设计原则:

1、单一职责原则(SRP):将对象的构建从对象本身分离出来,使得对象只需要关注自己的业务逻辑。具体来说,构建器把对象的构建单独放在了一个地方,对象可以专注于它自身的职责。

2、开闭原则(OCP):构建器模式允许添加新的步骤来创建对象,而不需要改变现有的构建器和客户端代码。这样,我们可以方便地扩展构建逻辑而不用影响现有的代码。

3、里氏替换原则(LSP):构建器模式中,构建器和具体的产品都是实现同一个接口或抽象类的子类。这保证了这些对象可以互相替换,而不影响系统的正常运行。

4、接口隔离原则(ISP):构建器模式提供了一个定义通用构建步骤的接口,而具体步骤可以通过实现这个接口来进行扩展。这样,构建器的使用者只需要关注通用接口,而不需要了解具体步骤的实现细节,实现了隔离接口和实现的分离。

5、依赖倒置原则(DIP):构建器模式中客户端只需要依赖于通用构建器接口和具体产品的抽象类或接口,而不需要依赖具体的构建器实现或产品类。这种方式可以解耦客户端和具体实现之间的关系。

构建器模式的优点:

  • 将复杂对象的构建过程分解为多个简单步骤,易于理解和维护。
  • 可以控制产品的构建过程,确保对象的一致性和完整性。
  • 可以灵活地组合不同的构建步骤,创建不同的表示。
  • 可以在构建过程中逐步创建对象,避免对象的不完整性。

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

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

相关文章

C/C++---------------LeetCode第349.两个数组的交集

两个数组的交集 题目及要求哈希算法在main里使用 题目及要求 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出…

【华为OD题库-029】恢复数字序列-java

题目 对于一个连续正整数组成的序列&#xff0c;可以将其拼接成一个字符串&#xff0c;再将字符串里的部分字符打乱顺序。如序列89101112, 拼接成的字符串19810112,打乱部分字符后得908112111。原来的正整数10就被拆成了0和1.现给定一个按如上规则得到的打乱字符的字符串&#…

物联网AI MicroPython学习之语法 ADC数模模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; ADC 介绍 模块功能: ADC数模转换模块 ADC功能在ESP32引脚32-39上可用&#xff0c;使用默认配置时&#xff0c;ADC引脚上的输入电压必须介于0.0v和1.0v之间&#xff08;任何高于1.0v的值都将读为4095&#x…

【信息安全】浅谈三种XSS(跨站脚本攻击)的攻击流程与防御措施

XSS 跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;简称XSS&#xff09;是一种常见的Web安全漏洞&#xff0c;攻击者通过在Web应用中注入恶意脚本&#xff0c;使得浏览器在解析页面时执行该脚本&#xff0c;从而实现攻击目的。 类型 存储型XSS&#xff1a;攻击者…

YoloV8改进策略:WaveletPool解决小目标的混叠问题,提高小目标的检测精度

文章目录 摘要论文:《抗混叠在微小目标检测中的重要性》1、简介2、相关研究2.1、微小物体检测2.2. 抗锯齿过滤器3、方法3.1. Wavelet Pooling3.2 一致顺序的Wavelet Pooling的WaveCNet3.3、Bottom-Heavy Backbone4、实验4.1、预训练数据集4.2、微小目标检测数据集4.3、抗混叠方…

从0开始学习JavaScript--JavaScript类型化数组进阶

前面的文章&#xff0c;已经介绍了JavaScript类型化数组的基本概念、常见类型和基本操作。在本文中&#xff0c;我们将深入探讨类型化数组的一些进阶特性&#xff0c;包括共享内存、大端小端字节序、以及类型化数组与普通数组之间的转换&#xff0c;通过更丰富的示例代码&#…

Keil MDK 安装

0 Preface/Foreword 1 下载和安装 官网&#xff1a;Keil Embedded Development Tools for Arm, Cortex-M, Cortex-R4, 8051, C166, and 251 processor families. Keil MDK 下载链接&#xff1a;Keil MDK 1.1 下载 根据需求下载对应的Keil MDK edition。 不同的editions包括 …

WaveletPool:抗混叠在微小目标检测中的重要性

文章目录 摘要1、简介2、相关研究2.1、微小物体检测2.2. 抗锯齿过滤器3、方法3.1. Wavelet Pooling3.2 一致顺序的Wavelet Pooling的WaveCNet3.3、Bottom-Heavy Backbone4、实验4.1、预训练数据集4.2、微小目标检测数据集4.3、抗混叠方法的选择及应用顺序4.4、小波的选择4.5、T…

Monoxide relay机制和连弩挖矿

这篇文章就两个点&#xff0c;relay机制 、 连弩挖矿 relay 最终原子性 Eventual Atomicity 一笔跨链交易&#xff0c;从取款shard中发出&#xff0c;到存款shard中. 当收款shard中将这笔夸片交易打包上链后&#xff0c;原子性才执行结束。 这样做的延迟是比较小的。 如何应…

Linux awk命令

一. 查询时间超过2000毫秒的请求 ✅log: 20231119-1.log 2023:11:19 09:07:10 SPLEND2000 请求开始 110 END 2023:11:19 09:07:11 SPLEND1000 请求开始 120 END 2023:11:19 09:07:12 SPLEND3000 请求开始 119 END 2023:11:19 09:07:13 SPLEND4000 请求开始 156 END 2023:11:1…

深度神经网络下的风格迁移模型

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 斯坦福大学李飞飞团队的风格迁移模型是一种基于深度学习的图像处理技术&#xff0c;可以将一张图像的风格转移到另一张图像上。该模型…

Go 命名规范:全面指南

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 在软件开发领域中&#xff0c;命名规范在提升代码可读性、可维护性和一致性方面起着至关重要的作用。良好定义的命名规范确保代码…

python之循环

知识点&#xff1a;while 使用while循环一般需要定义一个标志位&#xff0c;用来开始和结束循环 flag True 注意&#xff1a;这里的True一定要大写&#xff0c;否则无法识别 当要循环结束的时候 flag False 例子 # 遍历所有的子列表&#xff0c;找出列表之和为最大的列表 d…

notepad++

目录 notepad标签自动补齐notepad安装插件&#xff1a;Emmet 和 Python Script第 1 步&#xff0c;安装emmet第 2 步&#xff0c;安装 Python Script第 3 步 更改快捷键 安装html代码格式化插件tidy21 安装2 使用2.1 效果 notepad快捷键 notepad标签自动补齐 1 2 3 打标签时…

MySQL数据库备份与恢复:物理备份和逻辑备份详解

MySQL数据库的备份与恢复是数据库管理中至关重要的一环&#xff0c;它确保了数据的安全性和可恢复性。在本文中&#xff0c;我们将深入讨论如何进行MySQL数据库的备份和恢复&#xff0c;并详解物理备份和逻辑备份的概念及区别。 1. 如何备份和恢复MySQL数据库&#xff1f; 1.…

编写函数求定积分的通用函数

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 不积跬步无以至千里&#xff0c;…

Hfish安全蜜罐部署

一、Hfish蜜罐介绍 HFish蜜罐官网 HFish是一款社区型免费蜜罐&#xff0c;侧重企业安全场景&#xff0c;从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发&#xff0c;为用户提供可独立操作且实用的功能&#xff0c;通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷…

注册中心CAP架构剖析

Nacos 支持 AP 或 CP AP Nacos 通过临时节点实现 AP 架构&#xff0c;将服务列表放在内存中&#xff1b; CP Nacos 通过持久化节点实现 CP 架构&#xff0c;将服务列表放在文件中&#xff0c;并同步到内存&#xff0c;通过 Raft 协议算法实现&#xff1b; 通过配置 epheme…

智能座舱架构与芯片 - (3) 硬件篇 上

一、介绍 在了解智能座舱的基本架构之后&#xff0c;我们有必要针对智能座舱域的硬件平台&#xff0c;软件平台&#xff0c;SOC等进行逐一介绍。从它们的整体结构中去认识最新的智能座舱组成部件&#xff0c;以及主要功能等。 如上图&#xff0c;是中央计算-区域控制架构下的智…

Java Finalization‘s Memory-Retention Issues 及Reference类解析

引言 《Effective Java Programming Language Guide》 一书中强烈建议不要使用java的finalize()方法去做对象消亡前的清理。因为jvm调用finalize()方法的时机并不确定&#xff0c;容易导致Memory-Retention Issues。通俗点讲就是内存没办法及时回收。 详细的见oracle的官方说明…