创建型模式之建造者模式

一、概述

1、建造者模式:将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示

2、将客户端与包含多个部件的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可

3、关注如何逐步创建一个复杂的对象,不同的建造者定义了不同的创建过程

4、总的来说,建造者模式适合用于构建复杂对象,或者构建过程种对象需要一定的组装顺序或逻辑的情景,能够提供更好的灵活性和可维护性

二、建造者模式的结构

建造者模式包含以下4个角色

(1)Builder(抽象建造者)

(2)ConcreteBuilder(具体建造者)

(3)Product(产品)

(4)Director(指挥者)

三、模式优点

1、客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象

2、每一个具体建造者都相对对立,与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,扩展方便,符合开闭原则

3、可以更加精细地控制产品地创建过程

四、模式缺点

1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,不适合使用建造者模式,因此其使用范围受到一定的限制

2、如果产品的内部变化复杂,可能会需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加了系统的理解难度和运行成本

五、模式适用环境

1、需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员变量

2、需要生成的产品对象的属性相互依赖,需要指定其生成顺序

3、对象的创建过程独立于该对象的类。在建造者模式种通过引入了指挥者类,将创建过程封装在指挥者类种,而不在建造者类和客户类中

4、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品

六、示例代码

#include <iostream>
using namespace std;//产品类
class Computer
{
public:void setCPU(const string& cpu){m_cpu = cpu;}void setRAM(int ram){m_ram = ram;}void setStorage(const string& storage){m_storage = storage;}void showInfo(){cout << "Computer Configuration:" << endl;cout << "- CPU:" << m_cpu << endl;cout << "- RAM:" << m_ram << endl;cout << "- Storage:" << m_storage << endl;}
private:string m_cpu;int m_ram;string m_storage;
};//抽象建造者类:ComputerBuilder
class ComputerBuilder
{
public:virtual void buildCPU() const = 0;virtual void buildRAM() const = 0;virtual void buildStorage() const = 0;virtual Computer* getResult() const = 0;
};//具体建造者类:ConcreteComputerBuilder
class ConcreteComputerBuilder : public  ComputerBuilder
{
public:ConcreteComputerBuilder(): m_computer(new Computer){}void buildCPU() const override{m_computer->setCPU("Intel i7");}void buildRAM() const override{m_computer->setRAM(16);}void buildStorage() const override{m_computer->setStorage("512GB SSD");}Computer* getResult() const override{return m_computer;}private:Computer* m_computer;
};//指挥者类:Director
class Director
{
public:Computer* createComputer(ComputerBuilder* builder){builder->buildCPU();builder->buildRAM();builder->buildStorage();return builder->getResult();}
};int main()
{Director director;ConcreteComputerBuilder builder;Computer* computer = director.createComputer(&builder);computer->showInfo();delete computer;return 0;
}

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

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

相关文章

Spring MVC源码中设计模式——适配器模式

适配器模式介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式&#xff0c;它结合了两个独立接口的功能。 应用场景&#xff1a; 1、系统需要使用现有的类&#xff0c;而此类的接口不符合系统的需要…

[c++] 继承和多态整理一

1 private 和 protected 继承&#xff0c;子类指针不能赋值给父类指针 如下代码&#xff0c;有一个基类 Base&#xff0c;Derived1&#xff0c;Derived2&#xff0c;Derived3 3 个子类继承了基类 Base&#xff0c;分别是 private 继承&#xff0c;protected 继承&#xff0c;p…

基于springboot+vue的纺织品企业财务管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Socket网络编程(五)——TCP数据发送与接收并行

目录 主要实现需求TCP 服务端收发并行重构启动main方法重构重构分离收发消息的操作重构接收消息的操作重构发送消息TCPServer调用发送消息的逻辑监听客户端链接逻辑重构Socket、流的退出与关闭 TCP 客户端收发并行重构客户端 main函数重构客户端接收消息重构客户端发送消息重构…

前端封装通用下载方法及下载后端返回的文件流

目录 1.下载方法封装 2.将后端返回的文件流转换为文件 3.总结 1.下载方法封装 ①说明 前端的请求大概分为三种类型 普通请求&#xff1a;常用的get&#xff0c;post&#xff0c;put&#xff0c;delete等请求 上传请求&#xff1a;使用post请求&#xff0c;发送formdata对…

Zookeeper学习1:概述、安装、应用场景、集群配置

文章目录 概述安装LinuxWindows 配置参数集群参考配置文件配置步骤流程启动 概述 Zookeeper&#xff1a; 为分布式框架组件提供协调服务的中间件 【类似&#xff1a;文件系统通知机制】 负责存储上下层应用关系的数据以及接收观察者注册监听&#xff0c;一旦观察查关心的数据发…

git操作基本指令

1.查看用户名 git config user.name 2.查看密码 git config user.password 3.查看邮箱 git config user.email 4.修改用户名 git config --global user.name "xxx(新用户名)" 5.修改密码 git config --global user.password "xxx(新密码)" 6.修改…

笔记73:ROS中的各种消息包

参考视频&#xff1a; 33.ROS 的标准消息包 std_msgs_哔哩哔哩_bilibili 34. ROS 中的几何包 geometry_msgs 和 传感器包 sensor_msgs_哔哩哔哩_bilibili 标准消息包&#xff1a;std_msgs常用消息包&#xff1a;common_msgs导航消息包&#xff1a;nav_msgs几何消息包&#xf…

实战分享:Tomcat打破双亲委派模型,实现Web应用独立与安全隔离的奥秘

目录 一、JVM 类加载机制 二、Tomcat 类加载器 2.2 findClass 介绍 3.2 loadClass 介绍 三、web应用隔离 3.1 Spring 加载问题 在开始文章内容之前&#xff0c;先来看三个问题 假如在 Tomcat 上运行了两个 Web 应用程序&#xff0c;两个 web 应用中有同名的Servlet&#xf…

C++数据结构与算法——二叉树的属性

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

AGI概念与实现

AGI AGI&#xff08;Artificial General Intelligence&#xff09;&#xff0c;中文名为“通用人工智能”或“强人工智能”&#xff0c;是指通过机器学习和数据分析等技术&#xff0c;使计算机具有类似于人类的认知和学习能力的技术. 多模态的大模型 &#xff08;Multimodal…

详细介绍如何用windows自带Hyper-V安装虚拟机(windows11和ubuntu22)

通过系统自带的hyper-v安装windows11&#xff0c;舒服又惬意&#xff0c;相比用第三方虚拟机软件速度快很多。 硬件准备 准备 系统需要符合能安装 Hyper-V 的最低要求windows版本含Hyper-V的功能 电脑空间 电脑要有足够的空间来安装你这个虚拟机。根据自己的磁盘容量情况来规…

2673. 使二叉树所有路径值相等的最小代价

给你一个整数 n 表示一棵 满二叉树 里面节点的数目&#xff0c;节点编号从 1 到 n 。根节点编号为 1 &#xff0c;树中每个非叶子节点 i 都有两个孩子&#xff0c;分别是左孩子 2 * i 和右孩子 2 * i 1 。 树中每个节点都有一个值&#xff0c;用下标从 0 开始、长度为 n 的整…

CloudCanal x Hive 构建高效的实时数仓

简述 CloudCanal 最近对于全周期数据流动进行了初步探索&#xff0c;打通了Hive 目标端的实时同步&#xff0c;为实时数仓的构建提供了支持&#xff0c;这篇文章简要做下分享。 基于临时表的增量合并方式基于 HDFS 文件写入方式临时表统一 Schema任务级的临时表 基于临时表的…

【Linux实践室】Linux初体验

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux 目录结构介绍2.2 &#x1f514;Linux …

WebFlux相关问题及答案(2024)

1、什么是Spring WebFlux&#xff1f; Spring WebFlux 是 Spring Framework 5.0 中引入的一个全新的反应式框架&#xff0c;用于构建异步、非阻塞且事件驱动的服务。它允许开发者使用响应式编程模型来处理并发性很高的操作&#xff0c;而无需担心传统的多线程环境中的复杂性。…

poi工具读写excel操作学习总结

写在前面的话 POI作为比较早期的Excel处理工具&#xff0c;其使用较为成熟且广泛。EasyExcel相较之下&#xff0c;则是相对较新的工具&#xff0c;其却有着比POI更为优越的一些特性&#xff0c;如更加简单的API接口和更加优秀的性能。 性能对比&#xff1a;在数据量较小的情况下…

mybatis mysql insert 主键id为空

错误示范 java代码设置了param参数&#xff0c;但是sql 字段没有带上参数&#xff0c;例如 void insertV2(Param("historyDO") HistoryDO historyDO); <insert id"insertDuplicate" parameterType"com.test.entity.HistoryDO"keyProperty&…

MySQL:一行记录如何

1、表空间文件结构 表空间由段「segment」、区「extent」、页「page」、行「row」组成&#xff0c;InnoDB存储引擎的逻辑存储结构大致如下图&#xff1a; 行 数据库表中的记录都是按「行」进行存放的&#xff0c;每行记录根据不同的行格式&#xff0c;有不同的存储结构。 页…

hippy 调试demo运行联调-mac环境准备篇

适用对于终端编译环境不熟悉的人看&#xff0c;仅mac端 hippy 调试文档官网地址 前提&#xff1a;请使用node16 联调预览效果图&#xff1a; 编译iOS Demo环境准备 未跑通&#xff0c;待补充 编译Android Demo环境准备 1、正常安装Android Studio 2、下载Android NDK&a…