《建造者模式(极简c++)》

        本文章属于专栏《设计模式(极简c++版)》


        继续上一篇《工厂模式(极简c++)》。本章简要说明建造者模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。

模式说明

  • 方案:不同场景对类的构建有不同需求时,使用类提供的构建接口来构建,而不是直接给成员变量赋值
  • 优点:把构建行为,和类的结构分离。增加了代码可扩展性,降低未来维护成本。
  • 缺点:引入了多个额外的类和接口,增加了代码的复杂度。增加了当前维护成本。

本质思想: “类构建过程”和“类的属性、结构、行为”分离。将对象的构建过程拆分成多个步骤,并定义一个抽象接口以及具体的实现类来完成每个步骤。

实践建议: 不使用建造者模式。直到设计、开发时发现,对象的构建过程比较复杂,且在较多场景需要构造,且构造过程不同。个人更偏爱工厂模式来做创建,将类的创建过程封装到一个函数,如果有不同的构建需求,通过输入参数走不同的构建逻辑,如果类的构建十分负责,如构建一个“人”,则通过组合的方式,构建多个类(如手脚头等),挂在“人”下面。在生产代码中,我至今还没见到过使用建造者模式的业务代码。这里的本质是大部分场景,“未来降低的维护成本”低于“当前增加的维护成本”

代码示例

#include <iostream>
#include <string>// 产品类
class Bird {
public:void setSpecies(const std::string& species) {m_species = species;}void setColor(const std::string& color) {m_color = color;}void show() {std::cout << "Species: " << m_species << std::endl;std::cout << "Color: " << m_color << std::endl;}
private:std::string m_species;std::string m_color;
};// 抽象建造者类
class BirdBuilder {
public:virtual void buildSpecies() = 0;virtual void buildColor() = 0;virtual Bird getResult() = 0;
};// 具体建造者类
class SparrowBuilder : public BirdBuilder {
public:void buildSpecies() override {m_bird.setSpecies("Sparrow");}void buildColor() override {m_bird.setColor("Brown");}Bird getResult() override {return m_bird;}
private:Bird m_bird;
};// 指导者类
class BirdDirector {
public:BirdDirector(BirdBuilder* builder) : m_builder(builder) {}void construct() {m_builder->buildSpecies();m_builder->buildColor();}
private:BirdBuilder* m_builder;
};int main() {SparrowBuilder builder;BirdDirector director(&builder);director.construct();Bird bird = builder.getResult();bird.show();// 输出://        Species: Sparrow//        Color: Brownreturn 0;
}

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

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

相关文章

python内置函数 L

python内置函数 L Python 解释器内置了很多函数和类型&#xff0c;任何时候都能使用。 L 名称描述len返回对象的长度。list返回一个新列表。locals返回一个字典&#xff0c;表示当前局部符号表。 len(s) 返回对象的长度&#xff08;元素个数&#xff09;。实参可以是序列&…

什么是docker(docker客户端、镜像、容器、仓库)

一、docker Docker 是一个开源的容器化平台&#xff0c;它可以让开发者打包应用程序及其依赖项成为一个轻量级、可移植的容器&#xff0c;然后在任何环境中运行。Docker 容器将应用程序及其依赖项打包到一个标准化单元中&#xff0c;包括代码、运行时环境、系统工具、系统库等…

RDP爆破

工具&#xff1a;超级弱口令检查工具 第一步&#xff1a;双击打开工具 第二步&#xff1a;导入账号 第三步&#xff1a;导入密码 第三步&#xff1a;线程 线程默认是50&#xff0c;如果担心影响业务可以修改为5 第四步&#xff1a;填写目标 第五步&#xff1a;选择需要检查的…

前端入职配置新电脑!!!

前端岗位入职第一天到底应该做些什么呢&#xff1f;又该怎样高效的认识、融入团队&#xff1f;并快速进入工作状态呢&#xff1f;这篇文章就来分享一下&#xff0c;希望对即将走向或初入前端职场的你&#xff0c;能够有所帮助。内含大量链接&#xff0c;欢迎点赞收藏&#xff0…

feigni请求添加拦截器

FeignClient 的 configuration 属性&#xff1a; Feign 注解 FeignClient 的 configuration 属性&#xff0c;可以对 feign 的请求进行配置。 包括配置Feign的Encoder、Decoder、 Interceptor 等。 feign 请求添加拦截器&#xff0c;也可以通过这个 configuration 属性 来指…

jenkins使用公共库问题

Jenkins解决上编译解决引用问题 本地运行 把公共库创建链接到指定项目目录下即可 mklink /d /j D:\codepath\xxxx\yyyyy\tool_base D:\codepath\tool_base

香港公司变更注册地址所需材料及流程全解析

香港公司变更注册地址&#xff1a;所需材料及流程全解析 各位老板好&#xff0c;我是经典世纪胡云帅&#xff0c;随着业务的拓展和发展&#xff0c;香港公司可能需要变更其注册地址。变更注册地址不仅关系到公司的日常运营&#xff0c;还与公司的法律地位和品牌形象息息相关。本…

python--剑指offer--题目目录-学习计划

第一天 09. 用两个栈实现队列30. 包含min函数的栈 第二天 06. 从尾到头打印链表24. 反转链表35. 复杂链表的复制 第三天 05. 替换空格58 - II. 左旋转字符串 第四天 03. 数组中重复的数字53 - I. 在排序数组中查找数字 I53 - II. 0&#xff5e;n-1中缺失的数字 第五天 04.…

git--协同开发

目录 1.本地常用命令 2.云端部署 1.本地常用命令 git init 初始化仓库 git status 显示当前工作区是否有未提交代码 git add (文件名) 提交文件到暂存区 git commit -m "提交说明" 提交文件到本地仓库 git log 显示当前分支上的日志记录 git reflog 显…

JS08-DOM节点

DOM节点 查找节点 父节点 通过.parentNode属性可以获得某个元素的父节点&#xff0c;并对其进行操作。例如&#xff0c;隐藏.son元素的父节点。 <div class"father"><div class"son">儿子</div></div><script>let son d…

cesium HeadingPitchRoll HeadingPitchRange

一、HeadingPitchRoll表示Heading、Pitch、Roll&#xff0c;用于orientation属性上的&#xff0c;比如camera的setView&#xff0c;flyTo var heading Cesium.Math.toRadians(0.0);var pitch Cesium.Math.toRadians(-25.0);var roll Cesium.Math.toRadians(0);viewer.camera…

PyTorch学习笔记之基础函数篇(六)

文章目录 4 运算函数基本数学运算线性代数运算随机数生成统计运算张量操作 4 运算函数 PyTorch 提供了丰富的运算函数&#xff0c;用于进行各种数学和矩阵操作。这些函数可以分为几个主要类别&#xff0c;包括基本数学运算、线性代数运算、随机数生成、统计运算、张量操作等。…

餐饮店引流活动方案与最佳营销方案揭秘

想开实体店或正在创业的朋友们&#xff0c;大家好&#xff01;我是一名资深的实体店创业者&#xff0c;本人经营鲜奶吧5年时间&#xff0c;做的是社区店&#xff0c;今天我将分享一些餐饮店引流活动和营销方案的干货&#xff0c;希望能给大家带来一些启发和帮助。 一、引流活动…

昆山劳务外包找邦芒人力 助力企业节约成本提升效率

劳务外包&#xff0c;对于企业而言&#xff0c;其优势不仅显著&#xff0c;且影响深远。在竞争日益激烈的市场环境中&#xff0c;将技术性和事务性的工作外包给专业机构&#xff0c;已成为众多企业的明智决策。通过外包&#xff0c;企业得以释放管理者的精力&#xff0c;使其更…

基于多尺度视网膜增强图像去雾算法(MSR,Multi-Scale Retinex),Matalb实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供有偿…

【Flink SQL】Flink SQL 基础概念(四):SQL 的时间属性

《Flink SQL 基础概念》系列&#xff0c;共包含以下 5 篇文章&#xff1a; Flink SQL 基础概念&#xff08;一&#xff09;&#xff1a;SQL & Table 运行环境、基本概念及常用 APIFlink SQL 基础概念&#xff08;二&#xff09;&#xff1a;数据类型Flink SQL 基础概念&am…

浅谈C++的模板—— 这一篇就够了

今天我们来谈谈C中有关于模板的知识&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;对于C模板来说&#xff0c;我们首先得了解以下几个术语 函数模板模板函数模板实例化模板特例化模板的实参推演模板的非类型参数非模板函数类模板模板类选择性实例化 下面&#xff0c;我…

在Visual Studio中调试 .NET源代码

前言 在我们日常开发过程中常常会使用到很多其他封装好的第三方类库&#xff08;NuGet依赖项&#xff09;或者是.NET框架中自带的库。如果可以设置断点并在NuGet依赖项或框架本身上使用调试器的所有功能&#xff0c;那么我们的源码调试体验和生产效率会得到大大的提升。今天我…

数据分析 | Matplotlib

Matplotlib 是 Python 中常用的 2D 绘图库&#xff0c;它能轻松地将数据进行可视化&#xff0c;作出精美的图表。 绘制折线图&#xff1a; import matplotlib.pyplot as plt #时间 x[周一,周二,周三,周四,周五,周六,周日] #能量值 y[61,72,66,79,80,88,85] # 用来设置字体样式…

解决nvm use后不生效

找到 nodejs 安装目录 nvm root 如果当前目录下没有你下载的nodejs&#xff0c;去nvm的根目录下查看&#xff08;我安装nvm时指定的nodejs目录没用&#xff0c;它依然会下载至nvm根目录下啊啊&#xff09; 编辑nvm配置文件 nvm根目录下的 settings.txt 文件 将path路径改为你…