C++设计模式——建造者模式(Builder)

一、什么是建造者模式?

建造者模式是一种创建型的软件设计模式,用于构造相对复杂的对象。

建造者模式可以将复杂对象的构建与它的表示分离,使得相同的构建过程可以得到不同的表示。如果说工厂模式和抽象工厂模式更注重产品整体,那建造者模式则更在乎产品的组成和细节

建造者模式的优点:
1、封装性好。有效地封装了建造过程(主要业务逻辑),使得系统整体的稳定性得到了一定保证。
2、解耦。产品本身和建造过程解耦,相同的建造过程可以创建出不同的产品。
3、产品建造过程精细化。该模式注重产品创建的整个过程,将复杂的步骤拆解得到多个相对简单的步骤,使得系统流程更清晰,且对细节的把控更精准。
4、易于扩展。如果有新产品需求,只需要添加一个建造者类即可,不需要改动之前的代码,符合开闭原则。

建造者模式的缺点:
1、产品的组成部分和构建过程要一致,限制了产品的多样性。
2、若产品内部有结构上的变化,则整个系统都要进行大改,增加了后期维护成本。

引用自: [1] https://zhuanlan.zhihu.com/p/631285995

二、建造者模式示例

我有这样一个场景。譬如现在我所做的项目,在整个系统中有一个部分叫做EFEM(一种传片机构),其中包含了loadport、robot和pre-aligner的三个part。对于不同的生产厂家,efem中这三个部分的具体实现可能不同。对应不同的客户,我们在设计产品时可能会配置不同供应商的efem产品,譬如在下例子中的efem厂家HWIN和JEL,这个时候,就需要能在代码中快速的切换不同的efem厂家。

#include <iostream>
#include <string>
using namespace std;/*** @brief The EFEMProduct class  efem产品*/
class EFEMProduct
{
public:EFEMProduct(){}~EFEMProduct(){}
};/*** @brief The Builder class 抽象构建者*/
class Builder
{
public:virtual ~Builder(){}virtual void addLoadport() = 0;virtual void addRobot() = 0;virtual void addAligner() = 0;EFEMProduct& getProduct(){ return m_pd;}
protected:Builder(){}EFEMProduct m_pd;
};/*** @brief The HwinBuilder class 上银生产的efem*/
class HwinBuilder : public Builder
{
public:HwinBuilder(){}~HwinBuilder(){}void addLoadport() override { cout << __FUNCTION__ << endl; }void addRobot() override { cout << __FUNCTION__ << endl; }void addAligner() override { cout << __FUNCTION__ << endl; }};/*** @brief The JelBuilder class Jel生产的efem*/
class JelBuilder : public Builder
{
public:JelBuilder(){}~JelBuilder(){}void addLoadport() override { cout << __FUNCTION__ << endl; }void addRobot() override { cout << __FUNCTION__ << endl; }void addAligner() override { cout << __FUNCTION__ << endl; }
};/*** @brief The Director class 监督者*/
class Director
{
public:Director(Builder* bld):m_bld_ptr(bld){}~Director(){}///void construct(){if(m_bld_ptr == nullptr){return;}m_bld_ptr->addLoadport();m_bld_ptr->addRobot();m_bld_ptr->addAligner();}
private:Builder* m_bld_ptr = nullptr;
};int main()
{/// 在后续需要切换不同efem厂商时,只需要快速指定builder/// 就可以实现软件上的适配工作。yydsDirector* d_0 = new Director(new HwinBuilder);d_0->construct();Director* d_1 = new Director(new JelBuilder);d_1->construct();return 0;
}

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

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

相关文章

程序员的吐槽

在职场中&#xff0c;每个人都可能遇到让自己不满的领导或同事。这位工作了7年的程序员&#xff0c;今天就要吐槽一下他职场中的种种不快。 一、领导的“关爱” 1. 瞎指挥 这位程序员所在的公司规模不大&#xff0c;领导对技术一窍不通&#xff0c;却喜欢对技术团队指手画脚。…

【开源】基于Vue+SpringBoot的智能教学资源库系统

项目编号&#xff1a; S 050 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S050&#xff0c;文末获取源码。} 项目编号&#xff1a;S050&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课…

Android中添加C或C++代码

1、创建cpp目录&#xff0c;用于存放C和C代码。 2、创建CMake构建脚本CMakeLists.txt文件&#xff0c;将其放在cpp目录中。 # Sets the minimum version of CMake required to build the native library. cmake_minimum_required(VERSION 3.22.1)# Declares and names the pro…

AI模型训练——入门篇(二)

导语&#xff1a;本文主要介绍了基于BERT的文本分类方法&#xff0c;通过使用huggingface的transformers库实现自定义模型和任务。具体步骤包括&#xff1a;使用load_dataset函数加载数据集&#xff0c;并应用自定义的分词器&#xff1b;使用map函数将自定义分词器应用于数据集…

vue运用之el-cascader组件

前言 el-cascader 是 Element UI 的级联选择器组件。以下是一些常见的 el-cascader 问题以及对应的案例代码。 1. 如何使用 el-cascader 创建一个级联选择器 以下是一个简单的 el-cascader 示例: <template> <el-cascader v-model="selected" :option…

Linux:进程状态

目录 1.Linux内核关于进程状态的源代码 2. 运行状态 3. 阻塞状态 4. 挂起 5.Linux中的进程状态 5.1 睡眠状态 5.2 暂停状态 5.3 僵尸进程与孤儿进程 我们在学习进程状态时&#xff0c;老师只是简单的让我们记住下面这张图 1.教材中进程操作系统的进程状态 那么这些…

分享常见msvcp140.dll丢失的解决方法,msvcp140.dll修复的问题

在使用电脑的过程中可能会出现关于msvcp140.dll丢失的问题&#xff0c;通常出现这样的问题都会导致电脑中的程序出现不能正常运行的情况。并且如果不及时将msvcp140.dll修复的话可能还会导致电脑出现其他的问题。这篇文章就将给大家介绍关于msvcp140.dll丢失的解决方法。 一.常…

基于安卓的2048益智游戏的设计与实现

基于安卓的2048益智类游戏的设计与实现 摘要&#xff1a;现如今随着社会日新月异&#xff0c;人们越来越离不开智能手机所提供的灵活性与便携性。安卓系统是在这股手机发展迅猛的潮流中其市场占有率过半的手机平台&#xff0c;基于安卓系统的游戏开发有着不可估量的前景。 本论…

抖音、快手、新东方来袭,旅游行业战火再起?

低调了许久的旅游行业&#xff0c;终于迎来了大复苏&#xff0c;旅客的出游热情也再度被点燃&#xff0c;出游人数呈现出不断攀升态势。以“十一”黄金周为例&#xff0c;据文化和旅游部数据中心统计&#xff0c;本次黄金周&#xff0c;国内旅游出游人数8.26亿人次&#xff0c;…

jupyter notebook 添加conda环境变量为内核(kenel)

第一步&#xff1a;安装ipykernel 在激活环境后&#xff0c;需要安装ipykernel包&#xff0c;以便将Conda环境添加到Jupyter Notebook中。使用以下命令安装&#xff1a; pip install ipykernel第二步&#xff1a;将Conda环境添加到Jupyter 需要将Conda环境添加到Jupyter Not…

Java for/forEach 不支持重新賦值

loop中不支持變量重新賦值 Local variable printTotal defined in an enclosing scope must be final or effectively final 需要優化&#xff0c;這樣寫太羅嗦。 JasperPrint printTotal null;for(JasperPrint print:printList) {if(printTotalnull) {/*********************…

echarts 对数坐标轴

echarts 对数坐标轴 描述 Echarts 柱状图数据大小差距过大&#xff0c;例如一个值是100000&#xff0c;一个值是5&#xff0c;值小的柱子就不会显示出来。 解决&#xff0c;使用对数坐标轴 option {tooltip: {trigger: axis,},xAxis: {type: category,data: [Mon, Tue, We…

【Linux基础开发工具】yum生态vim的配置与使用

目录 前言 1. Linux 软件包管理器 yum 1.1 什么是yum 1.2 快速上手yum 1.3 yum生态 2. Linux编辑器vim 2.1 vim的模式 2.2 vim使用技巧 3. vim编辑器辅助功能配置 3.1 配置 3.2 用户sudo权限配置 总结 前言 Linux基础指令与权限之后&#xff0c;Linux系统开发工具的使用…

【SparkSQL】DataFrame入门(重点:df代码操作、数据清洗API、通过JDBC读写数据库)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍DataFrame的组成、DataFrame的代码构建、DataFrame的入门操作、词频统计案例、电影数据分析、SparkSQL Shuffle 分区数目、SparkSQL 数据清洗API、DataFrame数据写出、DataFrame 通过JDBC读写数据库&#xff08;MyS…

DHCP、ARP、FTP、DNS、VRRP、STP、报文交互流程

目录 一、DHCP 1、DHCP终结 1、DHCP discover 2、DHCP offer 3、DHCP request 4、DHCP ack 5、DHCP request 6、DHCP 续租 2、DHCP终结 二、ARP 1、ARP类型 动态ARP 静态ARP ARP代理 ARP代理的分类&#xff1a;路由式代理、VLAN内的ARP代理、VLAN间的ARP代理。 6…

行情分析——加密货币市场大盘走势(11.30)

大饼已经形成了底背离&#xff0c;即MACD往下走&#xff0c;而价格还在往上走&#xff0c;这种往往后续会大跌。我们继续把空单拿好&#xff0c;已经持仓的无需加仓。多次上涨都一直不能突破&#xff0c;也说明多空和空军力量都很强&#xff0c;等待后续出方向&#xff0c;而笔…

HarmonyOS入门开发(三) 持久化存储Preferences

接入鸿蒙几天以来&#xff0c;发现各种和Android不一样的地方&#xff0c;今天来看一下Preferences存储 在Android中比如有ShardPreferences、Mmkv这些持久化存储方式&#xff0c;开发起来很方便&#xff0c;读取速度也很快&#xff0c;在鸿蒙里面也提供了对应的持久化存储方案…

WordPress两种方法实现上传媒体图片文件自动重命名

我们发布文章时&#xff0c;会上传一些图片、音频之类的文件。但是WordPress没有自动 给新上传文件重命名的功能&#xff0c;逐个文件去重命名那就太麻烦了&#xff0c;那么我们改如何自动给上传的媒体文件图片重命名呢&#xff1f; 我在网站搜索了些上WordPress上传媒体文件自…

‘tsc‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

最近在用nodejs typescript 某游戏服务器在做一些研究 nodejs-tcs 问题描述&#xff1a; 1.使用命令npm install -g typescript安装typescript后&#xff0c;输入 tsc命令&#xff0c;一直报错 tsc 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 2.目…