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

news/2024/11/8 2:45:50/

一、什么是建造者模式?

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

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

建造者模式的优点:
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.ppmy.cn/news/1255104.html

相关文章

Vue组件分装之$attrs、$listener传递属性及事件

使用v-bind"$attrs"来将父组件的属性传递给自定义按钮 使用v-on"$listeners"将父组件的事件监听器传递给自定义按钮。 使用$slots获取父组件所有插槽以及作用域插槽对应的参数#[name]"scopeData" 这样&#xff0c;自定义按钮就能够直接响应父…

【大数据】区分 hdfs dfs -ls 与 hdfs dfs -ls /

&#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680;&#x1f680; 吧 &#xff08;点赞 &#x1f9e1;、关注 &#x1f49b;、收藏 &#x1f49a;&#xff09;&#xff01;&#xff01;&#xff01;您的支持 &#x…

296_C++_一个dialog对话框在执行exec向系统发送一个延后销毁事件时,另一个对话框立刻接管了上一个对话框的销毁事件,导致死UI

1、根因分析 -根因分析:当有新版本并且grade等级是2的时候,点击ptz的时候使用的是RSDialog,WA_DeleteOnClose属性默认是为true的, 并且是栈上的变量,当关闭ptz的时候,diolog的exec结束会向系统发送延后销毁事件,此时退出ptz会弹出自动升级对话框,接管了 事件循环,则会调用前面…

【数电笔记】16-卡诺图绘制(逻辑函数的卡诺图化简)

目录 说明&#xff1a; 最小项卡诺图的组成 1. 相邻最小项 2. 卡诺图的组成 2.1 二变量卡诺图 2.2 三表变量卡诺图 2.3 四变量卡诺图 3. 卡诺图中的相邻项&#xff08;几何相邻&#xff09; 说明&#xff1a; 笔记配套视频来源&#xff1a;B站&#xff1b;本系列笔记并…

大数据湖项目建设方案:文档全文101页,附下载

关键词&#xff1a;大数据解决方案&#xff0c;数据湖解决方案&#xff0c;数据治理解决方案&#xff0c;数据中台解决方案 一、大数据湖建设思路 1、明确目标和定位&#xff1a;明确大数据湖的目标和定位是整个项目的基础&#xff0c;这可以帮助我们确定项目的内容、规模、所…

07、基于LunarLander登陆器的强化学习案例(含PYTHON工程)

07、基于LunarLander登陆器的强化学习&#xff08;含PYTHON工程&#xff09; 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&#xff0c;现在开始熟悉一下复现代码。全部工程可从最上方链接下载。 基于TENSORFLOW2.10 0、实践背景 gym的LunarLander是一个用于…

RocketMQ主从同步原理

一. 主从同步概述 主从同步这个概念相信大家在平时的工作中&#xff0c;多少都会听到。其目的主要是用于做一备份类操作&#xff0c;以及一些读写分离场景。比如我们常用的关系型数据库mysql&#xff0c;就有主从同步功能在。 主从同步&#xff0c;就是将主服务器上的数据同步…

奇葩问题:arp缓存、ip地址冲突(实际是ip地址被占用导致arp缓存出现问题)

文章目录 今天遇到个奇葩的问题 今天遇到个奇葩的问题 今天遇到个奇葩的问题&#xff0c;我把我们192.168.1.116的盒子ip改成192.168.2.116后&#xff0c;再改回来&#xff0c;发现我们盒子的http服务始终无法访问&#xff0c;用Advanced IP Scanner扫描一下&#xff0c;发现就…