当前位置: 首页 > news >正文

设计模式--建造者模式(Builder Pattern)

一、什么是建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,它关注如何按照一定的步骤和规则创建复杂对象。建造者模式的主要目的是将一个复杂对象的构建过程与其表示分离,从而使同样的构建过程可以创建不同的表示。

在建造者模式中,通常有以下几个核心角色:

  1. 产品(Product):表示要创建的复杂对象。产品类通常包含多个组成部分。
  2. 抽象建造者(Abstract Builder):定义了创建产品各个部分的接口,通常包含一系列抽象方法来构建不同的部分。
  3. 具体建造者(Concrete Builder):实现了抽象建造者接口,负责实际构建产品的各个部分。每个具体建造者可以定义不同的构建步骤和规则,从而创建不同的产品。
  4. 指挥者(Director):负责指导具体建造者构建产品的过程,通常通过一系列步骤来控制构建的顺序和流程。

使用建造者模式可以在构建复杂对象时,将构建逻辑分离出来,使得构建过程更加灵活,易于扩展和维护。这种模式特别适用于需要构建多种不同表示的对象,以及对象的构建过程比较复杂的情况。

与其他创建型模式(如工厂模式)相比,建造者模式更加关注对象的构建过程,而不仅仅是对象的实例化。它允许逐步构建对象的各个部分,从而更好地控制对象的创建和组装。

二、建造者模式的代码样例

以下是一个使用C++实现建造者模式的简单示例:

#include <iostream>
#include <string>// 产品类
class Product {
public:void setPartA(const std::string& part) {partA = part;}void setPartB(const std::string& part) {partB = part;}void setPartC(const std::string& part) {partC = part;}void show() {std::cout << "Product Parts: " << partA << ", " << partB << ", " << partC << std::endl;}private:std::string partA;std::string partB;std::string partC;
};// 抽象建造者类
class Builder {
public:virtual void buildPartA() = 0;virtual void buildPartB() = 0;virtual void buildPartC() = 0;virtual Product* getResult() = 0;
};// 具体建造者类A
class ConcreteBuilderA : public Builder {
public:void buildPartA() override {product->setPartA("Part A from ConcreteBuilderA");}void buildPartB() override {product->setPartB("Part B from ConcreteBuilderA");}void buildPartC() override {product->setPartC("Part C from ConcreteBuilderA");}Product* getResult() override {return product;}private:Product* product = new Product();
};// 指挥者类
class Director {
public:void construct(Builder* builder) {builder->buildPartA();builder->buildPartB();builder->buildPartC();}
};int main() {Director director;ConcreteBuilderA builderA;director.construct(&builderA);Product* productA = builderA.getResult();productA->show();return 0;
}

在这个示例中,我们定义了一个产品类 Product,一个抽象建造者类 Builder,以及一个具体建造者类 ConcreteBuilderA。还有一个指挥者类 Director,负责调用具体建造者来构建产品。在主函数中,我们创建了一个具体建造者对象 builderA,然后通过指挥者的指导来构建产品,并最终显示产品的部件。

建造者模式允许通过不同的具体建造者来构建不同的产品,以及通过不同的构建步骤来创建不同的产品表示。这种模式将构建过程与产品本身分离,使得创建复杂对象更加灵活和可维护。

三、使用建造者模式的注意事项

使用建造者模式时需要注意以下几个问题:

  1. 复杂性:建造者模式适用于创建复杂的对象,但也会引入更多的类和结构,增加了代码的复杂性。因此,只在对象的构建过程比较复杂且存在多个步骤时使用建造者模式。
  2. 指挥者的作用:指挥者类负责控制具体建造者的调用顺序和构建步骤,但指挥者本身可能会变得复杂。需要确保指挥者不过于复杂,以免影响代码的可维护性。
  3. 关注点分离:建造者模式将对象的构建过程与产品的表示分离,这样可以使构建过程更加灵活。但也可能导致代码中出现多个类,需要确保关注点清晰分离,以便维护和理解代码。
  4. 构建过程不可逆:建造者模式一般是逐步构建对象的各个部分,因此构建过程是不可逆的。一旦开始构建,就不能随意地取消或逆向操作。这可能会受到一些业务需求的限制。
  5. 变种和扩展:如果需要支持多种不同类型的产品,可能需要创建多个具体的建造者类。这可能导致代码的扩展,需要仔细权衡何时引入新的建造者。
  6. 性能:建造者模式可能会在对象构建过程中引入一些额外的开销,特别是在对象的部件较多或构建过程复杂的情况下。在性能要求较高的场景下,需要考虑这种开销是否可接受。

总之,建造者模式可以在创建复杂对象时提供更灵活的构建过程,并帮助分离对象的创建和表示。但也需要根据具体的场景权衡其优缺点,避免过度复杂化和不必要的设计。

在这里插入图片描述

相关文章:

设计模式--建造者模式(Builder Pattern)

一、什么是建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它关注如何按照一定的步骤和规则创建复杂对象。建造者模式的主要目的是将一个复杂对象的构建过程与其表示分离&#xff0c;从而使同样的构建过程可以创建不同的表示。…...

若依vue打印的简单方法

像我们后端程序员做前端的话,有时候真不需要知道什么原理,直接塞就好了 我们选用基于hiprint 的vue-plugin-hiprint来打印 目的是为了实现点击某些行的数据,然后点击某个按钮直接弹出下面的打印 此链接 大佬是原创,我拿来总结梳理一下 插件进阶功能请移步: 链接 插件模板制作页…...

Rust 基础语法学习

Rust 基础语法学习 文章目录 Rust 基础语法学习hello world变量数据类型整数类型进制表示方法浮点数类型布尔类型字符类型字符串复合类型元组结构体元组结构体 切片类型字符串切片数组切片 不可变变量与可变变量常量注释函数语句与表达式 流程控制语句if else条件判断while循环…...

iOS开发Swift-函数

1.函数的定义和调用 func greet(person: String) -> String { // 函数名 传入值 传入值类型 返回值类型let greeting "Hello" personreturn greeting } print( greet(person: "Anna") ) //调用2.函数的参数与返回值 (1)无参函数 func sayHe…...

序列化协议:JSON和XML

作者&#xff1a;CARROT 链接&#xff1a;https://www.zhihu.com/question/604811576/answer/3100483698 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 json和xml都是数据传输的格式。比如我们开发过程中需要和网…...

江西萍乡能源石油化工阀门三维扫描3d测量抄数建模-CASAIM中科广电

长期以来&#xff0c;石油天然气、石油石化、发电和管道输送行业在环保、健康和安全保障方面一直承受着巨大的压力&#xff0c;他们必须确保相关规程在各项作业中得到全面贯彻。 阀门作为流体管道运输中的组成部分&#xff0c;其装配密封度是保证流体运输安全的重要一环&#…...

Go【gin和gorm框架】实现紧急事件登记的接口

简单来说&#xff0c;就是接受前端微信小程序发来的数据保存到数据库&#xff0c;这是我写的第二个接口&#xff0c;相比前一个要稍微简单一些&#xff0c;而且因为前端页面也是我写的&#xff0c;参数类型自然是无缝对接_ 前端页面大概长这个样子 先用apifox模拟发送请求测试…...

第一个VUE程序?

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title></head> <body><div id"app">{{message}} </div><!-- 1.导入Vue.js --> <script s…...

电阻器件的分类

电阻器的种类碳膜电阻膜式电阻器中的一种。气态碳氢化合物在高温和真空中分解&#xff0c;碳沉积在瓷棒或者瓷管上&#xff0c;形成一层结晶碳膜。改变碳膜厚度和用刻槽的方式变更碳膜的长度可以得到不同的阻值。碳膜电阻成本较低&#xff0c;电性能和稳定性较差&#xff0c;一…...

QT基础教程之二 第一个Qt小程序

QT基础教程之二 第一个Qt小程序 按钮的创建 在Qt程序中&#xff0c;最常用的控件之一就是按钮了&#xff0c;首先我们来看下如何创建一个按钮 QPushButton * btn new QPushButton; 头文件 #include <QPushButton>//设置父亲btn->setParent(this);//设置文字btn-&g…...

Edge用户数据目录查找

创建 Microsoft Edge 用户数据目录变量...

最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码|霸王餐美团/饿了么系统/外卖红包cps粉丝裂变玩法源码下载

最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码、霸王餐美团、饿了么系统&#xff0c;粉丝裂变玩源码下载&#xff0c;外卖cps小程序项目&#xff0c;外卖红包cps带好友返利佣金分销系统程序、饿了么美团联盟源码&#xff0c;外卖cps带分销返利后端源码&#xff0c;基于L…...

数据库事务四大特性

事务的4大特性&#xff08;ACID&#xff09;&#xff1a; 原子性(Atomicity)&#xff1a; 事务是数据库的逻辑工作单位&#xff0c;它对数据库的修改要么全部执行&#xff0c;要么全部不执行。 一致性(Consistemcy)&#xff1a; 事务前后&#xff0c;数据库的状态都满足所有的完…...

浅谈Router和Route

router 和 route 是在前端框架中用于管理和处理路由的两个关键概念。这两者之间的关系可以通过具体的代码来解释。在本示例中&#xff0c;我将使用 React 和 React Router 来说明它们之间的关系。 Router&#xff08;路由器&#xff09;&#xff1a;Router 是一个库或框架&…...

Linux环境安装jdk

1.安装jdk 上传jdk.tar.gz;安装包在下载内容里可以直接下载tar -zxvf jdk.tar.gz;配置环境变量&#xff1a;vi /etc/profile&#xff1b;填入以下内容&#xff1b;退出编辑模式&#xff0c;保存&#xff1b;然后source /etc/profile使配置生效&#xff1b; export JAVA_HOME/d…...

数据隐私与安全在大数据时代的挑战与应对

文章目录 数据隐私的挑战数据安全的挑战应对策略和方法1. 合规和监管2. 加密技术3. 匿名化和脱敏4. 安全意识培训5. 隐私保护技术 结论 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&…...

vue3 基础知识 (生命周期) 06

你好&#xff01; 文章目录 一、生命周期二、生命周期过程三、组件的 v-model 一、生命周期 每个组件都可能从 创建、挂载、更新、卸载 等一系列的过程 在这个过程中的某一个阶段&#xff0c;用于可能会想要 添加一些属于自己的代码逻辑&#xff08;比如组件创建完成后请求一些…...

【Eclipse】汉化简体中文教程(官方汉化包,IDE自带软件安装功能),图文详情

目录 0.环境 1.步骤 1&#xff09;查看eclipse的版本 2&#xff09;在官网找语言包&#xff0c;并复制链接 3&#xff09;将链接复制到eclipse中 4&#xff09;汉化完成 0.环境 windows11&#xff0c;64位&#xff1b; eclipse 2021-6版本 1.步骤 思路&#xff1a;在官网找…...

Kotlin协程flow的debounce参数timeoutMillis特性

Kotlin协程flow的debounce参数timeoutMillis特性 <dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-core</artifactId><version>1.7.3</version><type>pom</type></dependency&…...

oracle 12c怎样修改varchar2允许的最大长度

12C单实例测试&#xff0c;varchar2在早期版本中最大长度限制为4000&#xff0c;当字段长度指定的比较长的时候会报错&#xff1a;ORA-00910: specified length too long for its datatype。 早期版本中虽然SQL数据类型限制为4000&#xff08;如表中的列的varchar2类型&#x…...

Meta2d.js完整指南:5步掌握专业级2D可视化引擎开发

Meta2d.js完整指南&#xff1a;5步掌握专业级2D可视化引擎开发 【免费下载链接】meta2d.js The meta2d.js is real-time data exchange and interactive web 2D engine. Developers are able to build Web SCADA, IoT, Digital twins and so on. Meta2d.js是一个实时数据响应和…...

3个关键场景与4步操作:深入解析RevokeMsgPatcher防撤回工具的技术实现与应用实践

3个关键场景与4步操作&#xff1a;深入解析RevokeMsgPatcher防撤回工具的技术实现与应用实践 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目…...

Phi-3-Mini-128K多轮对话效果实测:复杂任务规划与分解

Phi-3-Mini-128K多轮对话效果实测&#xff1a;复杂任务规划与分解 最近&#xff0c;我花了不少时间深度体验了Phi-3-Mini-128K这款模型。它的名字里带着“128K”&#xff0c;这超长的上下文长度&#xff0c;让我特别好奇它在处理复杂、多轮对话时的真实表现。毕竟&#xff0c;…...

Ryujinx:C编写的Nintendo Switch模拟器技术解析与应用指南

Ryujinx&#xff1a;C#编写的Nintendo Switch模拟器技术解析与应用指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx是一款用C#编写的实验性Nintendo Switch模拟器&#xff…...

慕尼黑工业大学全新突破:让2D图片生成器变身3D世界建造师

这项由慕尼黑工业大学领导的研究发表于2026年的计算机视觉与模式识别顶级会议&#xff0c;论文编号为arXiv:2603.19708v1。有兴趣深入了解的读者可以通过该编号查询完整论文。当你使用手机拍摄一张美丽风景照片时&#xff0c;你可能从未想过&#xff0c;这张平面照片其实包含了…...

创新音乐体验:foobox-cn全攻略

创新音乐体验&#xff1a;foobox-cn全攻略 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 在数字音乐时代&#xff0c;如何将本地播放器与网络电台无缝融合&#xff0c;打造个性化的音乐中心&#xf…...

7个技巧彻底改变你的Mac菜单栏体验:Ice终极配置指南

7个技巧彻底改变你的Mac菜单栏体验&#xff1a;Ice终极配置指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice Ice是一款强大的macOS菜单栏管理工具&#xff0c;专门帮助用户整理杂乱的菜单栏图标&…...

ESP32-CAM人脸识别从入门到实战:5步搞定考勤系统(附完整代码)

ESP32-CAM人脸识别考勤系统实战指南&#xff1a;低成本高精度部署方案 引言&#xff1a;重新定义考勤管理的技术革新 在传统考勤方式逐渐显露出效率瓶颈的今天&#xff0c;基于ESP32-CAM的人脸识别技术为中小企业和教育机构提供了一种革命性的解决方案。这套系统不仅突破了传统…...

误删Anaconda?3步极速抢救指南

Anaconda被误删后抢救手册技术文章大纲数据恢复的基本原理解释数据恢复的底层机制&#xff0c;包括文件系统如何处理删除操作&#xff0c;以及为何被删除的数据仍有可能恢复。涵盖不同操作系统&#xff08;Windows、macOS、Linux&#xff09;下的差异。立即停止使用受影响磁盘强…...

PrankWeb 蛋白质配体结合位点预测,超简单使用教程

一、PrankWeb 是什么&#xff1f; PrankWeb 是一个免费的在线蛋白质配体结合位点预测工具&#xff0c;基于机器学习算法 P2Rank。 它能帮你&#xff1a; 预测蛋白质上可能的药物结合口袋&#xff08;pockets&#xff09; 可视化蛋白质的三维结构和结合位点 …...