设计模式--建造者模式(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. 性能:建造者模式可能会在对象构建过程中引入一些额外的开销,特别是在对象的部件较多或构建过程复杂的情况下。在性能要求较高的场景下,需要考虑这种开销是否可接受。

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

在这里插入图片描述

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

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

相关文章

【微服务】06-安全问题

文章目录 1.反跨站请求伪造1.1 攻击过程1.2 攻击核心1.3 如何防御1.4 使用AntiforgeryToken机制来防御用到的类 2. 防开发重定向共计2.1 攻击过程2.2 攻击核心2.3 防范措施 3.防跨站脚本3.1 攻击过程3.2 防范措施 4.跨域请求4.1 同源与跨域4.2 CORS过程4.2 CORS是什么4.3 CORS请…

iTubeGo for Mac视频下载器

iTubeGo YouTube Downloader是一款功能强大的YouTube视频下载工具&#xff0c; 它具有以下特色&#xff1a; 多种格式支持&#xff1a;iTubeGo YouTube Downloader可以将YouTube视频下载为多种常见的视频和音频格式&#xff0c;包括MP4、MP3、AVI、FLV、MOV、WMV等&#xff0c…

C语言每日一题 ---- 打印从1到最大的n位数(Day 1)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C语言天天练 &#x…

基于Java+SpringBoot+Vue前后端分离智慧图书管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

C++day6(多态实现动物园的讲解员和动物表演的相关介绍、用函数模板实现不同数据类型的交换功能)

1.比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&#xff0c;他会为每种动物表演做简单的介绍。 在这个场景中&#xff0c;我们可以将动…

开始MySQL之路——外键关联和多表联合查询详细概述

多表查询和外键关联 实际开发中&#xff0c;一个项目通常需要很多张表才能完成。例如&#xff0c;一个商城项目就需要分类表&#xff0c;商品表&#xff0c;订单表等多张表。且这些表的数据之间存在一定的关系&#xff0c;接下来我们将在单表的基础上&#xff0c;一起学习多表…

飞天使-k8s基础组件分析-持久化存储

文章目录 emptyDirhostpathpv和pvc介绍nfs作为静态pv案例nfs作为动态pv案例使用本地文件夹作为pv改变默认存储类及回收策略参考文档 emptyDir 重启文件还有&#xff0c;但是如果杀了进程&#xff0c;则会丢失文件 创建pod # kubectl apply –f redis.yaml校验pod是否处于运行&…

合宙Air724UG LuatOS-Air LVGL API控件--按钮 (Button)

按钮 (Button) 按钮控件&#xff0c;这个就不用多说了&#xff0c;界面的基础控件之一。 示例代码 – 按键回调函数 event_handler function(obj, event) if event lvgl.EVENT_CLICKED then print(“Clicked\n”) elseif event lvgl.EVENT_VALUE_CHANGED then print(“To…

嵌入式系统存储体系

一、存储系统概述 主要分为三种&#xff1a;高速缓存&#xff08;cache&#xff09;、主存和外存。 二、高速缓存Cache 高速缓冲存储器中存放的是当前使用得最多得程序代码和数据&#xff0c;即主存中部分内容的副本&#xff0c;其本身无自己的地址空间。在嵌入式系统中Cac…

人工智能在机器学习中的八大应用领域

文章目录 1. 自然语言处理&#xff08;NLP&#xff09;2. 图像识别与计算机视觉3. 医疗诊断与影像分析4. 金融风险管理5. 预测与推荐系统6. 制造业和物联网7. 能源管理与环境保护8. 决策支持与智能分析结论 &#x1f389;欢迎来到AIGC人工智能专栏~探索人工智能在机器学习中的八…

深度学习-4-二维目标检测-YOLOv3理论模型

单阶段目标检测模型YOLOv3 R-CNN系列算法需要先产生候选区域&#xff0c;再对候选区域做分类和位置坐标的预测&#xff0c;这类算法被称为两阶段目标检测算法。近几年&#xff0c;很多研究人员相继提出一系列单阶段的检测算法&#xff0c;只需要一个网络即可同时产生候选区域并…

【C++ 学习 ⑰】- 继承(下)

目录 一、派生类的默认成员函数 二、继承与友元 三、继承与静态成员 四、复杂的菱形继承及菱形虚拟继承 五、继承和组合 一、派生类的默认成员函数 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认构造函数&#xff0c;那么必须在派生…

HPC是如何助力AI推理加速的?

高性能计算&#xff08;High-Performance Computing&#xff0c;HPC&#xff09;通过提供强大的计算能力、存储资源和网络互联&#xff0c;可以显著地辅助人工智能&#xff08;AI&#xff09;应用更快地进行训练和推断。那么&#xff0c;HPC是如何助力AI推理加速的&#xff1f;…

多线程学习之生产者和消费者与阻塞队列的关系

生产者和消费者 概述&#xff1a; 生产者消费者问题&#xff0c;实际上主要是包含了两类线程&#xff1a; 生产者线程用于生产数据消费者线程用于消费数据 生产者和消费者之间通常会采用一个共享的数据区域&#xff0c;这样就可以将生产者和消费者进行解耦&#xff0c; 两…

在线OJ平台项目

一、项目源码 Online_Judge yblhlk/Linux课程 - 码云 - 开源中国 (gitee.com) 二、所用技术与开发环境 1.所用技术: MVC架构模式 (模型&#xff0d;视图&#xff0d;控制器) 负载均衡系统设计 多进程、多线程编程 C面向对象编程 & C 11 & STL 标准库 C Boost 准标…

材料空间「填空解谜」:MIT 利用深度学习解决无损检测难题

内容一览&#xff1a;材料检测在工程、科学及制造业中扮演着至关重要的角色。传统的材料检测方法&#xff0c;例如切割和化学试剂检测具有破坏性&#xff0c;同时较为耗费时间和资源。近期&#xff0c;MIT 科学家利用深度学习开发了一种技术&#xff0c;能够填补缺失信息&#…

certbot-https证书自动续期

certbot是一个免费的开源项目是EFF的一部分&#xff0c;自动化的工具&#xff0c;用于帮助管理和续期SSL/TLS证书。它可以安装、配置和自动续期证书。 1、安装 snapd 将 EPEL 存储库添加到您的 CentOS 安装中。输入y回车继续安装 sudo yum install snapd; sudo systemctl en…

无人机巡检输电线路是什么,怎么巡?

在今日科技迅速发展的时代&#xff0c;无人机为输电线路巡检提供了一种高效、安全且准确的解决方案。那么&#xff0c;为什么无人机巡检输电线路如此关键呢&#xff1f;以下是对这一问题的深入剖析。 1. 提高工作效率 传统的巡检模式与现实挑战&#xff1a;在过去&#xff0c;输…

6. 激活层

6.1 非线性激活 ① inplace为原地替换&#xff0c;若为True&#xff0c;则变量的值被替换。若为False&#xff0c;则会创建一个新变量&#xff0c;将函数处理后的值赋值给新变量&#xff0c;原始变量的值没有修改。 import torch from torch import nn from torch.nn import …

专访 Hyper Oracle:可编程的 zkOracle 打造未来世界的超算

许多 Web3 应用在实现的过程中&#xff0c;常常会遇到基础设施方面的限制&#xff0c;包括去中心化自动化、预言机、链上信息搜索等问题。绝大部分区块链的中间件网络都是依赖于节点质押来保证节点执行的诚实性&#xff0c;这样的模式会产生诸多衍生问题&#xff0c;例如安全性…