设计模式-建造者(生成器)模式
文章目录
- 简介
- 建造者模式的核心概念
- 产品(Product)
- 建造者(Builder)
- 指挥者(Director)
- 建造者模式与其他设计模式的关系
- 工厂模式和建造者模式uml对比
- 建造者模式的实现步骤
- 建造者模式的应用场景
- spring中应用
- 建造者模式的优缺点
- 优点
- 缺点
- 简单总结
简介
在本文中,我们将介绍建造者模式的概念、作用和优势,并探讨它与其他设计模式的关系。
建造者模式的核心概念

产品(Product)
产品是由建造者创建的复杂对象,它具有多个属性和方法。在建造者模式中,产品是建造者的最终结果。
建造者(Builder)
建造者是负责构建产品的接口。它定义了创建产品的步骤和方法,通常包括设置属性和返回最终产品的方法。
指挥者(Director)
指挥者是负责协调建造者的对象。它指导建造者按照特定的顺序执行构建步骤,以生成最终产品。
建造者模式与其他设计模式的关系
建造者模式通常与以下设计模式相关联:
- 抽象工厂模式:抽象工厂模式用于创建一系列相互依赖或相互关联的对象,而建造者模式用于创建复杂对象。两者的区别在于,抽象工厂模式强调一系列产品的创建,而建造者模式则侧重于单个复杂对象的创建。
- 工厂模式:工厂模式用于根据某些条件创建不同类型的对象,而建造者模式则用于创建复杂对象。两者的区别在于,工厂模式强调对象类型的选择,而建造者模式侧重于对象的组装过程。
工厂模式和建造者模式uml对比


建造者模式的实现步骤
以下是实现建造者模式的步骤:
- 定义产品的属性和方法,确保产品具有所需的特性。
- 创建抽象建造者接口,其中包含创建产品的方法和设置产品属性的方法。
- 创建具体建造者类,实现建造者接口,并实现创建产品和设置属性的方法。
- 实现指挥者类,它接收一个建造者对象,并根据特定的顺序调用建造者的方法来构建产品。
- 编写客户端代码,实例化指挥者和具体建造者对象,并调用指挥者的构建方法来获取最终产品。
以下是一个示例代码:
// 产品类
public class Product {private String attribute1;private String attribute2;// 设置属性的方法public void setAttribute1(String attribute1) {this.attribute1 = attribute1;}public void setAttribute2(String attribute2) {this.attribute2 = attribute2;}public void Show(){System.out.println(attribute1);System.out.println(attribute2);}// 其他方法...
}// 抽象建造者接口
public interface Builder {void buildAttribute1(String attribute1);void buildAttribute2(String attribute2);Product getResult();
}// 具体建造者类
public class ConcreteBuilder implements Builder {private Product product;public ConcreteBuilder() {this.product = new Product();}@Overridepublic void buildAttribute1(String attribute1) {System.out.println("设置Attribute1");product.setAttribute1(attribute1);}@Overridepublic void buildAttribute2(String attribute2) {System.out.println("设置Attribute2");product.setAttribute2(attribute2);}@Overridepublic Product getResult() {return product;}
}// 指挥者类
public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public void construct() {System.out.println("指挥建造开始-----------");builder.buildAttribute1("Value 1");builder.buildAttribute2("Value 2");// 还可以按照特定顺序调用其他建造者方法}
}// 客户端代码
public class Client {public static void main(String[] args) {Builder builder = new ConcreteBuilder();Director director = new Director(builder);director.construct();Product product = builder.getResult();product.Show();// 使用产品...}
}

建造者模式的应用场景
建造者模式常用于以下情况:
- 创建复杂对象,其中对象的创建过程较为复杂,需要多个步骤和组件参与。
- 对象的构建过程需要独立于其组装方式,允许在同一个构建过程中使用不同的建造者来创建不同的表示。
- 希望改变产品的内部表示,而不影响产品的整体结构。
spring中应用
在 Spring 框架中,建造者模式的应用主要体现在 Bean 的创建和配置过程中。Spring 使用了建造者模式来构建和配置各种类型的 Bean。
具体来说,Spring 中的建造者模式主要包括以下几个核心组件:
-
ApplicationContext(应用上下文):在 Spring 中,通常使用 ApplicationContext 来管理和配置 Bean。ApplicationContext 负责创建和管理 Bean,并负责处理 Bean 的依赖关系和生命周期等。ApplicationContext 可以通过 XML 配置文件、注解或 Java 代码来配置和创建 Bean。
-
BeanDefinitionBuilder:BeanDefinitionBuilder 是 Spring 提供的一个用于构建 BeanDefinition(Bean 定义)的建造者类。BeanDefinitionBuilder 提供了一系列的方法,用于配置 Bean 的各个属性和依赖关系等。通过链式调用这些方法,可以根据需求设置 BeanDefinition 的各个属性。
-
BeanFactory:BeanFactory 是 Spring 的核心接口之一,它负责创建和管理 Bean。在创建 Bean 时,通常会使用 BeanFactory 来创建 Bean 实例,并将其配置和初始化。
-
XML 配置文件:在 Spring 中,可以使用 XML 配置文件来配置和描述 Bean 的信息。XML 配置文件中的 元素通常对应着一个 Bean 对象,通过配置元素的属性和子元素,可以设置 Bean 的各个属性和依赖关系等。
在使用 Spring 的过程中,开发者通常会使用 ApplicationContext 作为主要的建造者角色,通过配置和调用它提供的方法来创建和管理各种类型的 Bean。开发者可以使用 BeanDefinitionBuilder 构建 Bean 定义,并将其注册到 ApplicationContext 中,以实现对 Bean 的自定义配置和构建过程。
总结起来,Spring 在 Bean 的创建和配置过程中使用了建造者模式,通过 ApplicationContext、BeanDefinitionBuilder、BeanFactory 和 XML 配置文件等组件来实现对 Bean 的构建和配置。使用建造者模式可以简化 Bean 的创建和配置过程,提高灵活性和可维护性。
建造者模式的优缺点
优点
- 分离构建过程和表示,使得相同的构建过程可以创建不同的表示。
- 提供灵活的配置选项,客户端可以根据需求自由选择建造者和创建的步骤。
- 允许改变产品的内部表示,对客户端代码透明。
缺点
-
增加了代码量:建造者模式需要创建具体建造者类、指挥者类等额外的类,从而增加了代码量。每个产品的构建过程可能不同,因此可能需要创建多个具体建造者类。虽然这些额外的类增加了一定的开销,但可以提高代码的可维护性和灵活性。
-
组装顺序需要开发者控制:在建造者模式中,开发者需要控制对象构建过程的组装顺序。如果组装顺序不正确,可能导致产品组装错误或缺失某些部分。因此,开发者需要仔细设计和控制组装顺序,增加了设计的复杂性。
简单总结
建造者模式通过将对象的构建过程封装起来,使得建造过程和表示分离,并提供灵活的配置选项。通过抽象建造者、具体建造者和指挥者的协作,客户端可以获得不同的产品表示。然而,建造者模式增加了代码量,并对构建顺序有一定要求。
相关文章:
设计模式-建造者(生成器)模式
文章目录 简介建造者模式的核心概念产品(Product)建造者(Builder)指挥者(Director)建造者模式与其他设计模式的关系工厂模式和建造者模式uml对比 建造者模式的实现步骤建造者模式的应用场景spring中应用 建…...
内存泄露排查思路
1、泄露情况 启动闪退运行一段时间宕机 2、排查步骤 获取堆内存快照dump使用VisualVM分析dump文件通过查看堆信息的情况,定位内存溢出问题 jmap -dump:formatb,fileheap.hprof pid -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath输出路径 3、在VisualVM中分…...
kafka学习-概念与简单实战
目录 1、核心概念 消息和批次 Topic和Partition Replicas Offset broker和集群 生产者和消费者 2、开发实战 2.1、消息发送 介绍 代码实现 2.2、消息消费 介绍 代码实现 2.3、SpringBoot Kafka pom application.yaml KafkaConfig producer consumer 1、核心…...
爬虫进阶-反爬破解5(selenium的优势和点击操作+chrome的远程调试能力+通过Chrome隔离实现一台电脑登陆多个账号)
目录 一、selenium的优势和点击操作 二、chrome的远程调试能力 三、通过Chrome隔离实现一台电脑登陆多个账号 一、selenium的优势和点击操作 1.环境搭建 工具:Chrome浏览器chromedriverselenium win用户:chromedriver.exe放在python.exe旁边 MacO…...
音视频编码格式-AAC ADT
例子:config 1408 1408(16进制) : 0001 0100 0000 1000 audioObjectType(5bit)为 00010 , 即 2, profie (audioObjectType -1 ) AAC LC samplingFrequencyIndex (4bit) 为 1000 , 即 8 , 对应的采样频率为 16000 channelConfiguration (…...
【计算机网络】网络编程接口 Socket API 解读(3)
Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。 本文讲述的 socket 内容源自 Linux 发行版 centos 9 上的 man 工具,和其他平台(比如 os-x …...
kafka知识小结
1.为什么分区数只能增加,不能减少? 按照Kafka现有的代码逻辑而言,此功能完全可以实现,不过也会使得代码的复杂度急剧增大。 另外实现此功能需要考虑的因素很多,比如删除掉的分区中的消息该作何处理? 如果随着分区一起消失则消息的可靠性得不到保障; 如果需要保留则又需…...
算法刷题记录-DP(LeetCode)
746. Min Cost Climbing Stairs 代码 int minCostClimbingStairs(vector<int>& cost) {if (cost.size()<2){return 0;}int cache[cost.size()1];cache[0]0;cache[1]0;for (int i 2; i < cost.size(); i) {cache[i] min(cache[i-2]cost[i-2],cache[i-1]cost[i…...
Springboot整合Neo4J图数据库
1.引入依赖 JDK11, neo4J4.4.23 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version><relativePath/> <!-- lookup parent …...
Unity 2018发布在iOS 16.3偶尔出现画面不动的问题
1)Unity 2018发布在iOS 16.3偶尔出现画面不动的问题 2)IL2CPP在Xcode下增量编译问题 3)帧同步实现PuppetMaster布娃娃系统的问题 这是第351篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等…...
蠕虫病毒流量分析案例
背景 某供排水集团的网络管理员对其网络的健康状况持认可态度,表示网络运行正常,没有发现异常行为。然而,由于网络环境变得越来越复杂,仅凭借传统的网络经验已经不能全面了解网络情况。因此,我们为供排水集团安装了Ne…...
Transformer(一)—— Attention Batch Normalization
Transformer详解 一、RNN循环神经网络二、seq2seq模型三、Attention(注意力机制)四、Transformer4.1 self attention4.2 self-attention的变形——Multi-head Self-attention4.3 Masked Attention4.4 Positional Encoding4.5 Batch Normalization4.6 Lay…...
2023高教社杯数学建模C题思路代码 - 蔬菜类商品的自动定价与补货决策
# 1 赛题 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此, 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…...
【C++漂流记】一文搞懂类与对象的封装
本篇文章主要说明了类与对象中封装的有关知识,包括属性和行为作为整体、访问权限、class与struct的区别、成员属性的私有化,希望这篇文章可以帮助你更好的了解类与对象这方面的知识。 文章目录 一、属性和行为作为整体二、访问权限三、class与struct的区…...
ctfshow 反序列化
PHP反序列化前置知识 序列化和反序列化 对象是不能在字节流中传输的,序列化就是把对象转化为字符串以便存储和传输,反序列化就是将字符串转化为对象 魔术方法 __construct() //构造,当对象new时调用 __wakeup() //执行unserialize()时&am…...
数据结构:线性表之-单向链表(无头)
目录 什么是单向链表 顺序表和链表的区别和联系 顺序表: 链表: 链表表示(单项)和实现 1.1 链表的概念及结构 1.2单链表(无头)的实现 所用文件 将有以下功能: 链表定义 创建新链表元素 尾插 头插 尾删 头删 查找-给一个节点的…...
为IT服务台构建自定义Zia操作
Zia是manageengine的商业人工智能助手,是ServiceDesk Plus Cloud的虚拟会话支持代理。使用Zia,您可以优化帮助台管理,还可以缩小最终用户与其帮助台之间的差距,Zia通过执行预配置的操作来帮助用户完成他们的服务台任务。 例如&…...
【C/C++】BMP格式32位转24位
问题 如题 解决方法 bmp文件格式参考:【C/C++】BITMAP格式分析_vc++ bitmap头文件_sunriver2000的博客-CSDN博客BITMAP文件大体上分成四个部分,如下表所示。文件部分长度(字节)位图文件头 Bitmap File Header14位图信息数据头 Bitmap Info Header40调色板 Palette4*n (n≥…...
合宙Air724UG LuatOS-Air LVGL API控件-滑动条 (Slider)
滑动条 (Slider) 滑动条看起来和进度条是有些是有些像,但不同的是滑动条可以进行数值选择。 示例代码 -- 回调函数 slider_event_cb function(obj, event)if event lvgl.EVENT_VALUE_CHANGED then local val (lvgl.slider_get_value(obj) or "0")..&…...
SQLAlchemy 封装的工具类,数据库pgsql(数据库连接池)
1.SQLAlchemy是什么? SQLAlchemy 是 Python 著名的 ORM 工具包。通过 ORM,开发者可以用面向对象的方式来操作数据库,不再需要编写 SQL 语句。 SQLAlchemy 支持多种数据库,除 sqlite 外,其它数据库需要安装第三方驱动。…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
