9.建造者模式 (Builder Pattern)

定义

建造者模式(Builder Pattern)是一种创建型设计模式,旨在将复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。该模式的核心思想是通过一步步地构建一个复杂的对象,每个步骤独立且可扩展,并且最终的产品(对象)可以通过不同的构建步骤得到不同的结果。

结构:

建造者模式通常由以下几个角色组成:

Product(产品):最终构建出来的复杂对象。
Builder(建造者):抽象建造者,定义了构建各个部件的接口,通常会有一个返回产品的方法。
ConcreteBuilder(具体建造者):实现了 Builder 接口,负责构建具体的部件,并最终生成产品。
Director(指挥者):负责指导建造者进行构建,按照一定的顺序来调用建造者的方法,最终获取产品。
Client(客户端):使用 Director 和 Builder 来构建产品。

类的设计分析:

1. House(产品类)
class House {// 复杂对象的定义,包含房屋的不同部分
};House 类表示最终要构建的复杂对象。
在这个例子中,它代表一个房子,包含房子的多个部分,如墙壁、屋顶、地板等。
2. HouseBuilder(抽象建造者)
class HouseBuilder {
public:House* GetResult() {return pHouse;}virtual ~HouseBuilder() {}
protected:House* pHouse;virtual void BuildPart1() = 0;virtual void BuildPart2() = 0;virtual void BuildPart3() = 0;virtual void BuildPart4() = 0;virtual void BuildPart5() = 0;
};
  • HouseBuilder 类 是一个抽象建造者,它定义了建造过程中的各个步骤,如 BuildPart1 到 BuildPart5 方法。这些方法是用来构建房子的不同部分的。
  • GetResult() 方法返回最终构建的产品(House 对象)。
  • HouseBuilder 中的具体部分构建由继承类实现。
3. StoneHouse(具体产品类)
class StoneHouse : public House {// 石头房子可能有一些特定的功能
};
4. StoneHouseBuilder(具体建造者)
class StoneHouseBuilder : public HouseBuilder {
protected:virtual void BuildPart1() {// 构建房子的第一个部分(例如,地基)}virtual void BuildPart2() {// 构建房子的第二个部分(例如,墙壁)}virtual void BuildPart3() {// 构建房子的第三个部分(例如,屋顶)}virtual void BuildPart4() {// 构建房子的第四个部分(例如,窗户)}virtual void BuildPart5() {// 构建房子的第五个部分(例如,门)}
};
  • StoneHouseBuilder 类 是 HouseBuilder 的具体实现类,负责实现如何一步步构建 StoneHouse(石头房子)的各个部分。每个 BuildPart 方法的实现可能会根据不同的房屋类型进行不同的构建。
5. HouseDirector(指挥者)
class HouseDirector {
public:HouseBuilder* pHouseBuilder;HouseDirector(HouseBuilder* pHouseBuilder) {this->pHouseBuilder = pHouseBuilder;}House* Construct() {pHouseBuilder->BuildPart1();for (int i = 0; i < 4; i++) {pHouseBuilder->BuildPart2();}bool flag = pHouseBuilder->BuildPart3();if (flag) {pHouseBuilder->BuildPart4();}pHouseBuilder->BuildPart5();return pHouseBuilder->GetResult();}
};
  • HouseDirector 类 是指挥者角色,负责使用建造者 HouseBuilder 来构建产品(房子)。它定义了房子的建造过程,按照一定顺序调用建造者的各个方法,最终返回建造好的 House 产品。
6. Client(客户端)
  • 客户端负责创建具体的建造者(如 StoneHouseBuilder)和指挥者(HouseDirector),并通过指挥者来完成房子的建造。

实现步骤

1.定义产品:首先定义 House 类,它包含房子各个部分的数据结构。
2.创建抽象建造者:定义一个 HouseBuilder 类,包含构建各个部分的抽象方法,以及返回最终产品的方法 GetResult。
3.创建具体建造者:实现 HouseBuilder 类的具体子类(如 StoneHouseBuilder),提供每个构建步骤的具体实现。
4.创建指挥者:定义一个 HouseDirector 类,它使用具体建造者按照顺序来构建房子。
5.客户端调用:客户端可以创建具体的建造者和指挥者,并通过指挥者来构建房子。

调用示例:
int main() {// 创建具体的建造者StoneHouseBuilder* builder = new StoneHouseBuilder();// 创建指挥者并传入建造者HouseDirector* director = new HouseDirector(builder);// 开始构建房子House* house = director->Construct();// 输出构建的结果std::cout << "House is built!" << std::endl;delete builder;delete director;delete house;return 0;
}

什么场景使用 Builder Pattern

建造者模式适用于以下几种场景:

复杂对象的创建过程:当一个对象的构建过程非常复杂时(有多个部件或多个构建步骤),可以使用建造者模式将构建过程拆分成多个步骤,使得每个步骤独立,并且支持不同的构建方式。

例如,构建复杂的文件解析器、数据库连接器、UI 界面等。
对象的组成部分不变,但表现形式不同:当构建的对象(如房子)由多个部件组成,但可以有不同的表现形式时,可以使用建造者模式。

例如,构建不同类型的房子(如木房子、石房子等),它们共享相同的构建步骤,但具体实现会有所不同。
需要一步一步构建对象的情况:当构建一个对象需要分多个步骤,且顺序不可随意改变时,建造者模式特别适用。

避免对象构建过程的重复:如果有多个地方需要重复相同的对象构建逻辑,建造者模式可以将构建过程封装在 Builder 类中,避免代码重复。

总结

建造者模式通过分离复杂对象的构建过程和对象的表示,使得构建过程更加灵活,支持多种对象表示方式。在实际开发中,当对象的构建过程繁琐且有多个可选的组成部分时,建造者模式是一种非常有效的设计模式。

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

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

相关文章

k8s集群

文章目录 项目描述项目环境系统与软件版本概览项目步骤 环境准备IP地址规划关闭selinux和firewall配置静态ip地址修改主机名添加hosts解析 项目步骤一、使用kubeadm安装k8s单master的集群环境&#xff08;1个master2个node节点&#xff09;1、互相之间建立免密通道2.关闭交换分…

HTTP和HTTPS协议详解

HTTP和HTTPS协议详解 HTTP详解什么是http协议http协议的发展史http0.9http1.0http1.1http2.0 http协议的格式URI和URL请求request响应response http协议完整的请求与响应流程 HTTPS详解为什么使用HTTPSSSL协议HTTPS通信过程TLS协议 HTTP详解 什么是http协议 1、全称Hyper Tex…

2025开源DouyinLiveRecorder全平台直播间录制工具整合包,多直播同时录制、教学直播录制、教学视频推送、简单易用不占内存

一、DouyinLiveRecorder软件介绍&#xff08;文末提供下载&#xff09; 官方地址&#xff1a;GitHub - ihmily/DouyinLiveRecorder 本文信息来源于作者GitHub地址 一款简易的可循环值守的直播录制工具&#xff0c;基于FFmpeg实现多平台直播源录制&#xff0c;支持自定义配置录制…

学习threejs,pvr格式图片文件贴图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️PVR贴图1.2 ☘️THREE.Mesh…

Beans模块之工厂模块注解模块CustomAutowireConfigurer

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

(一)DeepSeek大模型安装部署-Ollama安装

大模型deepseek安装部署 (一)、安装ollama curl -fsSL https://ollama.com/install.sh | sh sudo systemctl start ollama sudo systemctl enable ollama sudo systemctl status ollama(二)、安装ollama遇到网络问题&#xff0c;请手动下载 ollama-linux-amd64.tgz curl -L …

使用Pygame制作“贪吃蛇”游戏

贪吃蛇 是一款经典的休闲小游戏&#xff1a;玩家通过操控一条会不断变长的“蛇”在屏幕中移动&#xff0c;去吃随机出现的食物&#xff0c;同时要避免撞到墙壁或自己身体的其他部分。由于其逻辑相对简单&#xff0c;但可玩性和扩展性都不错&#xff0c;非常适合作为新手练习游戏…

【prompt实战】AI +OCR技术结合ChatGPT能力项目实践(BOL提单识别提取专家)

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 1. 需求背景 2. 目标 3. BOL通用处理逻辑…

dl学习笔记(8):fashion-mnist

过完年懒羊羊也要复工了&#xff0c;这一节的内容不多&#xff0c;我们接着上次的fashion-mnist数据集。 首先第一步就是导入数据集&#xff0c;由于这个数据集很有名&#xff0c;是深度学习的常见入门数据集&#xff0c;所以可以在库里面导入。由于是图像数据集所以&#xff…

【Rust自学】20.2. 最后的项目:多线程Web服务器

说句题外话&#xff0c;这篇文章非常要求Rust的各方面知识&#xff0c;最好看一下我的【Rust自学】专栏的所有内容。这篇文章也是整个专栏最长&#xff08;4762字&#xff09;的文章&#xff0c;需要多次阅读消化&#xff0c;最好点个收藏&#xff0c;免得刷不到了。 喜欢的话…

Android学习21 -- launcher

1 前言 之前在工作中&#xff0c;第一次听到launcher有点蒙圈&#xff0c;不知道是啥&#xff0c;当时还赶鸭子上架去和客户PK launcher的事。后来才知道其实就是安卓的桌面。本来还以为很复杂&#xff0c;毕竟之前接触过windows的桌面&#xff0c;那叫一个复杂。。。 后面查了…

[创业之路-276]:从燃油汽车到智能汽车:工业革命下的价值变迁

目录 前言&#xff1a; 从燃油汽车到智能汽车&#xff1a;工业革命下的价值变迁 前言&#xff1a; 燃油汽车&#xff0c;第一次、第二次工业革命&#xff0c;机械化、电气化时代的产物&#xff0c;以机械和电气自动化为核心价值。 智能汽车&#xff0c;第三次、第四次工业革…

Spring Boot - 数据库集成07 - 数据库连接池

数据库连接池 文章目录 数据库连接池一&#xff1a;知识准备1&#xff1a;什么是数据库连接池&#xff1f;2&#xff1a;数据库连接池基本原理 二&#xff1a;HikariCP连接池1&#xff1a;简单使用2&#xff1a;进一步理解2.1&#xff1a;是SpringBoot2.x默认连接池2.2&#xf…

Python-基于PyQt5,Pillow,pathilb,imageio,moviepy,sys的GIF(动图)制作工具

前言&#xff1a;在抖音&#xff0c;快手等社交平台上&#xff0c;我们常常见到各种各样的GIF动画。在各大评论区里面&#xff0c;GIF图片以其短小精悍、生动有趣的特点&#xff0c;被广泛用于分享各种有趣的场景、搞笑的瞬间、精彩的动作等&#xff0c;能够快速吸引我们的注意…

使用线性回归模型逼近目标模型 | PyTorch 深度学习实战

前一篇文章&#xff0c;计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 使用线性回归模型逼近目标模型 什么是回归什么是线性回归使用 PyTorch 实现线性回归模型代码执行结…

【蓝桥杯嵌入式】2_LED

1、电路图 74HC573是八位锁存器&#xff0c;当控制端LE脚为高电平时&#xff0c;芯片“导通”&#xff0c;LE为低电平时芯片“截止”即将输出状态“锁存”&#xff0c;led此时不会改变状态&#xff0c;所以可通过led对应的八个引脚的电平来控制led的状态&#xff0c;原理图分析…

尝试在Office里调用免费大语言模型的阶段性进展

我个人觉得通过api而不是直接浏览器客户端聊天调用大语言模型是使用人工智能大模型的一个相对进阶的阶段。 于是就尝试了一下。我用的是老师木 袁进辉博士新创的硅基流动云上的免费的大模型。——虽然自己获赠了不少免费token&#xff0c;但测试阶段用不上。 具体步骤如下&am…

LabVIEW自定义测量参数怎么设置?

以下通过一个温度采集案例&#xff0c;说明在 LabVIEW 中设置自定义测量参数的具体方法&#xff1a; 案例背景 ​ 假设使用 NI USB-6009 数据采集卡 和 热电偶传感器 监测温度&#xff0c;需自定义以下参数&#xff1a; 采样率&#xff1a;1 kHz 输入量程&#xff1a;0~10 V&a…

理解 C 与 C++ 中的 const 常量与数组大小的关系

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;数组大小的常量要求&#x1f4af;C 语言中的数组大小要求&#x1f4af;C 中的数组大小要求&#x1f4af;为什么 C 中 const 变量可以作为数组大小&#x1f4af;进一步的…

【Elasticsearch】文本分类聚合Categorize Text Aggregation

响应参数讲解: key &#xff08;字符串&#xff09;由 categorization_analyzer 提取的标记组成&#xff0c;这些标记是类别中所有输入字段值的共同部分。 doc_count &#xff08;整数&#xff09;与类别匹配的文档数量。 max_matching_length &#xff08;整数&#xff09;从…