C++建造者模式:Builder Pattern

2023-10-27

建造者模式又称生成者模式,该模式是一种创建型设计模式,能够分步骤创建复杂对象。

该模式允许使用相同的创建代码通过不同的创建过程生成不同类型的对象。

建造者模式(Builder)所构建的对象一定是庞大而复杂的,并且一定是按照既定的制造工序将组件组装起来的,例如计算机、汽车、建筑物等。我们通常将负责构建这些大型对象的工程师称为建造者。建造者模式又称为生成器模式,主要用于对复杂对象的构建、初始化,它可以将多个简单的组件对象按顺序一步步组装起来,最终构建成一个复杂的成品对象。

建造者模式将一个复杂对象的创建过程封装起来;允许对象通过多个步骤来创建,而且可以改变创建过程(这和只有一个步骤的工厂模式不同)。

工厂模式:创建不同但是相关类型的对象(继承同一父类或接口的一组子类),由给定的参数决定创建哪种类型的对象。


建造者模式:创建一种类型的复杂对象,通过设置不同的参数,"定制化"地创建不同的对象。

案例:

比如我们现在已经用程序实现了一个汽车使用的全过程:启动,发动引擎,鸣笛,停车。但是不同的人使用汽车的习惯可能不同,比如张三习惯启动后先按一下喇叭,而李四习惯先按下喇叭在启动,这就导致上面的程序不能同时满足两人的要求。所以,我们这里要实现可以让客户自己定义执行顺序的需求。

我们来整理一下思路,首先,不管客户的需求是什么样子的,汽车的功能是不会变的,永远都有启动、发动引擎、鸣笛和停车的功能,所以,我们可以把这些共有的行为抽象到父类定义,具体怎么实现交给子类去实现即可。然后,由于张三和李四想要按不同的顺序执行汽车的四个方法,我们通过一个方法设置汽车启动的步骤就可以了。

注意:真正实现中使用汽车的每一个步骤都涉及到创建多个复杂的类,这里简化成一个方法的调用;

类图:

实现如下:

car.h:

#ifndef CAR_H
#define CAR_H
#include <iostream>
using namespace std;

class Car {
public:
    virtual void start() = 0;
    virtual void engineBoom() = 0;
    virtual void alarm() = 0;
    virtual void stop() = 0;
};

class ACar : public Car {
public:
    virtual void start() override
    {
        cout << "A类车启动" << endl;
    }

    virtual void engineBoom() override
    {
        cout << "A类车发动引擎" << endl;
    }

    virtual void alarm() override
    {
        cout << "A类车鸣笛" << endl;
    }

    virtual void stop() override
    {
        cout << "A类车停车" << endl;
    }
};

class BCar : public Car {
public:
    virtual void start() override
    {
        cout << "B类车启动" << endl;
    }

    virtual void engineBoom() override
    {
        cout << "B类车发动引擎" << endl;
    }

    virtual void alarm() override
    {
        cout << "B类车鸣笛" << endl;
    }

    virtual void stop() override
    {
        cout << "B类车停车" << endl;
    }
};


#endif // CAR_H


builder.h:

#ifndef BUILDER_H
#define BUILDER_H
#include "car.h"

class Builder {
public:
    virtual void setSequence() = 0;

protected:
    Car* m_car;
};

class ACarBuilder : public Builder {
public:
    ACarBuilder()
    {
        m_car = new ACar();
    }

    virtual void setSequence() override
    {
        m_car->start();
        m_car->engineBoom();
        m_car->alarm();
        m_car->stop();
    }
};

class BCarBuilder : public Builder {
public:
    BCarBuilder()
    {
        m_car = new BCar();
    }

    virtual void setSequence() override
    {
        m_car->start();
        m_car->alarm();
        m_car->engineBoom();
        m_car->stop();
    }
};

#endif // BUILDER_H


main.cpp:

/*
 * 建造者模式
 *
 * date:2023-9-18
*/

#include "builder.h"

int main()
{
    Builder* builder = new ACarBuilder();
    builder->setSequence();

    cout << endl;

    builder = new BCarBuilder();
    builder->setSequence();
}

运行截图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++建造者模式:Builder Pattern 的相关文章

  • C++复合模式:Compound Pattern

    模式通常被一起使用 并被组合在同一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式 以解决一般或重复发生的问题 注 是为了解决一般或重复发生的问题 而不是简单的认为使用了多个模式就是复合模式 绝不要为了使用模式而使用模式 具体问
  • C++外观模式:Facade Pattern

    装饰者 不改变接口 但加入责任 适配器 将一个接口转换成另一个接口 外观 让接口更简单 外观模式 将一个或数个类的复杂的一切都隐藏在背后 只显露出一个干净美好的外观 外观模式提供了一个统一的接口 用来访问子系统中的一群接口 外观模式定义了一
  • 创建型模式-建造者模式理解

    1 前言 首先建造者模式适合下面的场景 进行使用 假设不同的对象有着基本的共同特点 或者配合前端进行页面布局 进行构建一个复杂的对象 那么可以参考工厂方法模式进行抽取对象 并进行解耦 达到一个设计符合要求的对象的过程 eg 1 保险产品 前
  • Gof23设计模式之建造者模式

    1 概述 建造者模式 Builder Pattern 又叫生成器模式 是一种对象构建模式 它可以将复杂对象的建造过程抽象出来 抽象类别 使这个抽象过程的不同实现方法可以构造出不同表现 属性 的对象 建造者模式是一步一步创建一个复杂的对象 它
  • 设计模式之Builder模式(链式调用)

    问题背景 Builder模式在很多地方都有用到 代码风格也比较简洁 但是对其深入的了解并不多 因此在参考其他博客的基础上写此文章 首先先看我的实际应用到Builder模式的场景 场景一 这是在编写RPC简易框架时 需要输入服务端的配置信息时
  • C++解释器模式:Interpreter Pattern

    当有语言要解释时 请使用解释器模式为语言创建解释器 解释器模式的核心是解释器类 在解释器模式中一般会定义两种解释器 终结符解释器 Terminal Expression Interpreter 终结符解释器用于解释语言中的基本单位 对应语法
  • C++状态模式:State Pattern

    状态模式 允许对象在其内部状态改变时改变它的行为 对象看起来好像修改类它的类 状态模式是有限状态机 Finite State Machine 的一种实现方式 我们都知道 http请求报文由请求行 请求头 请求空行和请求体四部分组成 服务器在
  • C++桥接模式:Bridge Pattern

    在现实生活中 某些类具有两个或多个维度的变化且这多个维度都可能需要后期扩展 如图形既可按形状分 又可按颜色分 如何设计类似于 Photoshop 这样的软件 能画不同形状和不同颜色的图形呢 如果用继承方式 m 种形状和 n 种颜色的图形就有
  • C++装饰者模式:Decorator Pattern

    设计原则 类应该对扩展开发 对修改关闭 装饰者可以在所委托被装饰者的行为之后加上自己的行为 以达到特定的目的 装饰者模式 动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 装饰者和被装饰者必须是一样的类型 也就是
  • 漫谈设计模式之建造者模式(Builder)

    建造者模式 Builder 又叫生成器模式 属于对象创建型模式 建造者模式的目的是要将一个复杂对象的构建与它的表示分离 使得同样的构建过程可以创建不同的表示 产品 说得通俗点就是一个产品 表示 的构建 生产 过程是一样的 但是同样的生产过程
  • java设计模式之建造者模式

    定义 建造者模式将一个复杂对象的构建过程与它的表示分离 使得同样的构建过程可以创建不同的表示 属于创建型设计模式 对于用户而言 使用建造者模式只需指定需要创建的类型就可以获得对象 创建过程及细节不需要了解 根据建造者模式的定义 可以简单的理
  • 【gitHubDailyShare】开源的 C++ 入门学习资源,C++ 匠心之作

    分享 GitHub 上一份开源的 C 入门学习资源 Cpp 0 1 Resource 主要包含以下内容 第 1 阶段 C 匠心之作 从 0 到 1 入门 第 2 阶段实战 通讯录管理 第 3 阶段 C 核心编程 第 4 阶段实战 基于多态的
  • 设计模式-建造者模式

    建造者模式是一种创建型设计模式 它允许你创建复杂对象的不同表示 而无需直接与其构造函数参数进行交互 建造者模式将一个复杂对象的构建与其表示分离 使得同样的构建过程可以创建不同的表示 建造者模式的核心思想是将一个复杂对象的构建过程分解为多个简
  • 设计模式:(三)原型、建造者、适配器、桥接模式

    一 原型模式 Prototype 1 概述 1 定义 用原型实例指定了要创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个对象再创建另外一个可定制的对象 无需知道如何创建的细节 2 工作原理 通过将一
  • 【设计模式学习】11种高频设计模式之建造者模式

    文章目录 相关介绍 代码介绍 常规用法 静态内部类方法 系列文章目录 参考资料 相关介绍 1 定义 将一个复杂对象的构建与它的表示分离 使得同样得构建过程可以创建不同得表示 2 作用 在用户不知道对象得建造过程和细节的情况下就可以直接创建复
  • C++责任链模式:Chain of Responsibility Pattern

    当你想要让一个以上的对象有机会能够处理某个请求的时候 就可以使用责任链模式 责任链模式 将请求的发送和接收解耦 让多个接收对象都有机会处理这个请求 将这些接收对象串成一条链 并沿着这条链传递这个请求 直到链上的某个接收对象能够处理它为止 通
  • C++代理模式:Proxy Pattern

    代理模式 为另一个对象提供一个替身或者占位符以控制对这个对象的访问 这样做的好处是 可以在目标对象实现的基础上 增强额外的功能操作 即扩展目标对象的功能 代理需要做的 控制和管理访问 需要时可以扩展目标对象的功能 被代理的对象可以是远程的对
  • 设计模式(八)----创建型模式之建造者模式与工厂模式区别

    1 工厂方法模式VS建造者模式 工厂方法模式注重的是整体对象的创建方式 而建造者模式注重的是部件构建的过程 意在通过一步一步地精确构造创建出一个复杂的对象 我们举个简单例子来说明两者的差异 如要制造一个超人 如果使用工厂方法模式 直接产生出
  • 用spss进行主成分分析

    此次同样通过一道例题讲解如何运用spss进行对数据的主成分分析 下表是我国2005年第1 2季度各地区城镇居民家庭收支基本情况的统计数据 根据这些数据进行主成分分析 并依据分析结果对地区城镇居民家庭收支情况进行排序和分类 地区 平均每户人口
  • C++抽象工厂模式:Abstract Factory Pattern

    抽象工厂模式是工厂方法模式的升级版本 工厂方法模式只有一个抽象产品类 而抽象工厂模式有多个 工厂方法模式的具体工厂类只能创建一个具体产品类的实例 而抽象工厂模式可以创建多个 案例 在上一章节工厂方法模式的基础上 将披萨的各种原料生产抽象成一

随机推荐

  • MWeb发布笔记到印象笔记,提示“Content of submitted note was malformed”

    文章目录 issue solution 参考 issue MWeb发布笔记到印象笔记 提示 Error Domain com evernote sdk Code 11 Content of submitted note was malfor
  • 解决m1芯片Mac安装node失败问题

    用nvm安装node时终端报错 type aesni cbc sha256 enc avx2 function deps openssl config archs linux x86 64 asm avx2 crypto aes aesni
  • C/C++笔试必须熟悉掌握的头文件系列(五)——iostream

    1 说明 iostream 的意思是输入输出流 直接点说就是in out stream 流 从字面就可以理解这个函数库所要操作的无非是从流中获取输入 向终端流中输出 iostream 库的基础是两种命名为 istream 和 ostream
  • 清除IEXPLORER.EXE病毒

    E枭雄 Trojan Nethief IExplorer 病毒档案 网络枭雄 病毒的一个新变种 值得关注 警惕程度 发作时间 随机 病毒类型 木马病毒 传播方式 网络 感染对象 网络 病毒介绍 此 病毒是网络枭雄病毒的一个新变种 可以在Wi
  • vue中如何引入jquery详解

    用vue cli脚手架工具构建项目成功后 当需要引入JQ 可用以下方法 1 首先在package json里的dependencies加入 jquery 3 2 1 2 在终端里输入npm install jquery save dev 当
  • Reid Strong Baseline 代码解析

    目录 1 设置自己的数据集 1 1使用作者提供的dataset格式 1 2新建dataset格式 2 测试时设置是否只采用跨相机的样本 3 训练 3 1 修改模型 3 1 1参数解读 3 1 2使用自己的模型 4测试 5本篇博客的不足 1
  • 基于Python+OpenCV的视频字符化(深度学习+机器视觉)含全部工程源码

    目录 前言 总体设计 系统整体结构图 系统流程图 运行环境 Python 环境 OpenCV环境 模块实现 1 视频读取及处理 2 色素块识别与替换 3 视频合成 4 操作系统上的实现 系统测试 工程源代码下载 其它资料下载 前言 本项目利
  • SQL - Navicat查看SQL执行计划

    我们在工作中肯定写过sql语句 也会进行一下sql语句的优化 在优化sql语句里看过相应的explain 在进行sql语句优化的时候 理解执行计划中各个参数的意思 弄明白执行的顺序 对sql优化有很大的帮助 1 通过 Explain 命令查
  • nestjs知识系列:使用postman测试websocket

    原文 Using WebSocket Requests Postman Learning Center websocket socket emit socket on等api详解 Using WebSocket Requests Postm
  • Linux Oracle使用常用命令

    ps ef grep oracle 查看Oracle启动的进程 常被用作查看Oracle服务是否已启动 登录Oracle sqlplus nolog conn as sysdba sqlplul as sysdba sqlplul as s
  • linux安装mysql8.0详解

    linux安装mysql8 0 一 安装前准备工作 二 安装mysql 三 配置mysql 一 安装前准备工作 1 卸载系统自带的mariadb root mesdb01 dbdata rpm qa grep mariadb mariadb
  • shell编程

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net Leo1120178518 article details 100055607 She
  • MUI扫描功能的实现

    开发手机APP时经常需要用到扫描二维码 条码的功能 在使用MUI框架开发时 我们可以使用H5plus封装好的Barcode类 Barcode模块管理条码扫描 提供常见的条码 二维码及一维码 的扫描识别功能 可调用设备的摄像头对条码图片扫描进
  • 整合springBoot+SSM及框架说明

    目录 1 关于springBoot的说明 1 1 springBoot的定义 1 2 springBoot的作用 2 关于springMVC的说明 2 1 springMVC的作用 3 Spring的的作用 4 mybatis的作用 一 创
  • 轻松搞懂Linux中的用户管理

    文章目录 概念 用户账户 用户组 用户权限 用户管理工具 概念 用户管理是Linux系统管理员必须掌握的重要技能之一 Linux系统是一个多用户操作系统 可以支持多个用户同时使用 每个用户拥有自己的账户和权限 因此管理员需要了解如何创建 管
  • vue之父子组件间通信实例讲解(props、$ref、$emit)

    组件是 vue js 最强大的功能之一 而组件实例的作用域是相互独立的 这就意味着不同组件之间的数据无法相互引用 那么组件间如何通信 也就成为了vue中重点知识了 这篇文章将会通过props ref和 emit 这几个知识点 来讲解如何实现
  • vue自定义指令

    除了核心功能默认内置的指令 v model 和 v show Vue 也允许注册自定义指令 有的情况下 对普通 DOM 元素进行底层操作 这时候就会用到自定义指令 下面定义了一个v test指令绑定数据name
  • jupyter的安装步骤

    1 安装python文件 首先去官网python去下载python的安装包 点击donwload 选择合适的系统 这里我是windown系统 点击进去 如图找到有installer的去下载 不建议下载最新版本的 会有兼容问题 2 安装pyt
  • Qgis python开发教程(一)Introduction

    最近工作中用到Qgis开发 找了网上一圈 关于python的开发很少 最后找到官方API 官方API很不错 但是英文难免麻烦一些 自己尝试翻译出来并实践一下 以备自己后续的学习 并非逐字逐句翻译 就是把自己认为重点的地方记录摘要 水平有限
  • C++建造者模式:Builder Pattern

    建造者模式又称生成者模式 该模式是一种创建型设计模式 能够分步骤创建复杂对象 该模式允许使用相同的创建代码通过不同的创建过程生成不同类型的对象 建造者模式 Builder 所构建的对象一定是庞大而复杂的 并且一定是按照既定的制造工序将组件组