设计模式(9)建造者模式
一、
1、概念:将一个复杂对象的构造与它的表示分离,使得同样的构造过程可以创建不同的表示。建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化;建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
2、结构图:
import java.util.ArrayList;//产品类
public class Product {ArrayList<String> parts = new ArrayList<>();//添加新的产品不见public void add(String part) {parts.add(part);}// 列举所有的产品不见public void show() {for (String part : parts) {System.out.println(part);}}
}//抽象的建造者类
public abstract class Builder {//建造部件Apublic abstract void buildPartA();//建造部件Bpublic abstract void buildPartB();//得到产品public abstract Product getResult();}//具体的建造类
public class ConcreteBuilder1 extends Builder {private Product product = new Product();@Overridepublic void buildPartA() {product.add("部件A");}@Overridepublic void buildPartB() {product.add("部件B");}@Overridepublic Product getResult() {return product;}
}//具体的建造类
public class ConcreteBuilder2 extends Builder {private Product product = new Product();@Overridepublic void buildPartA() {product.add("部件X");}@Overridepublic void buildPartB() {product.add("部件Y");}@Overridepublic Product getResult() {return product;}
}//指挥者类
public class Director {//建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。public void construct(Builder builder) {builder.buildPartA();builder.buildPartB();}
}public static void main(String[] args) {Director director = new Director();Builder b1 = new ConcreteBuilder1();Builder b2 = new ConcreteBuilder2();director.construct(b1);Product result1 = b1.getResult();director.construct(b2);Product result2 = b2.getResult();}
3、使用场景:当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时使用。
4、优点:
- 首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
- 其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。
5、建造者模式与工厂模式的区别:
- 建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。
- 与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端
相关文章:
设计模式(9)建造者模式
一、 1、概念:将一个复杂对象的构造与它的表示分离,使得同样的构造过程可以创建不同的表示。建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化;建造…...
PHP 创业感悟交流平台系统mysql数据库web结构apache计算机软件工程网页wamp
一、源码特点 PHP 创业感悟交流平台系统(含论坛)是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 源码下载: https://download.csdn.…...
工作流程引擎之flowable(集成springboot)
0、背景 现状:公司各部门业务系统有各自的工作流引擎,也有cross function的业务在不同系统或OA系统流转,没有统一的去规划布局统一的BPM解决方案,近期由于一个项目引发朝着整合统一的BPM方案,特了解一下市面上比较主流…...
leetcode54. 螺旋矩阵(java)
螺旋矩阵 题目描述解题 收缩法 上期经典算法 题目描述 难度 - 中等 原题链接 - leecode 54 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例1: 输入:matrix [[1,2,3],[4,5,6],[7…...
go gorm 查询
定义model package mysqltestimport ("errors""fmt""gorm.io/gorm" )type Product struct {gorm.ModelID uint gorm:"primarykey"Name string gorm:"column:name"Price float64 gorm:"column:price_value&quo…...
Flutter GetXController 动态Tabbar 报错问题
场景: 1.Tabbar的内容是接口获取的 2. TabController? tabController;; 在onInit 方法中初始化tabbarController tabController TabController(initialIndex: 0, length: titleDataList.length, vsync: this); 这时候会报一个错误 Controllers l…...
Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透)
目录 一、缓存预热 二、缓存雪崩 三、缓存击穿 四、缓存穿透 一、缓存预热 开过车的都知道,冬天的时候启动我们的小汽车之后不要直接驾驶,先让车子发动机预热一段时间再启动。缓存预热是一样的道理。 缓存预热就是系统启动前,提前将相关的…...
UE4/5Niagara粒子特效学习(使用UE5.1,适合新手)
目录 创建空模板 创建粒子 粒子的基础属性 粒子的生命周期 颜色 大小设置 生成的位置 Skeletal Mesh Location的效果: Shape Location 添加速度 添加Noise力场 在生成中添加: 效果: 编辑 在更新中添加: 效果&…...
from moduleA import * 语句 和import moduleA 的区别
from moduleA import * 语句和import moduleA 的区别是: from moduleA import * 语句会将moduleA模块中的所有内容(函数、变量、类等)直接导入到当前模块的命名空间中,这样就可以直接使用它们,而不需要加上模块名的限…...
【leetcode 力扣刷题】交换链表中的节点
24. 两两交换链表中的节点 24. 两两交换链表中的节点两两节点分组,反转两个节点连接递归求解 24. 两两交换链表中的节点 题目链接:24. 两两交换链表中的节点 题目内容: 题目中强调不能修改节点内部值,是因为如果不加这个限制的话…...
学会Mybatis框架:让你的代码更具灵活性、可维护性、安全性和高效性【二.动态SQL】
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Mybatis的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Mybatis动态SQL如何应用 1.需求 2.…...
Oracle 中 ROWNUM 使用问题记录
ROWNUM 使用问题记录(2023-08-17) Oracle 版本: 19.0.0.0.0 Enterprise现象:今天在项目遇到一个问题,测试人员反馈前一天能看到的数据今天看不到了 用表格举例,这是前一天看到的数据,有9、7、1 这几个数量信息 日期…...
MySQL数据库:内置函数
日期函数 规定:日期:年月日 时间:时分秒 函数名称作用描述current_date()当前日期current_time()当前时间current_timestamp()当前时间戳date(datetime)返回datetime参数的日期部分date_add(date,interval d_value_type)在date中添加…...
【C++杂货铺】探索string的底层实现
文章目录 一、成员变量二、成员函数2.1 默认构造函数2.2 拷贝构造函数2.3 operator2.4 c_str()2.5 size()2.6 operator[ ]2.7 iterator2.8 reserve2.9 resize2.10 push_back2.11 append2.12 operator2.13 insert2.14 erase2.15 find2.16 substr2.17 operator<<2.18 opera…...
c++ day1
定义一个命名空间Myspace,包含以下函数:将一个字符串中的所有单词进行反转,并输出反转后的结果。例如,输入字符串为"Hello World",输出结果为"olleH dlroW",并在主函数内测试该函数。 …...
变动的Python爬虫实现
在电商时代,了解商品价格的变动对于购物者和卖家来说都非常重要。本文将分享一种基于Python的实时监控电商平台商品价格变动的爬虫实现方法。通过本文的解决方案和代码示例,您将能够轻松监控商品价格,并及时做出决策。 一、了解需求和目标 在…...
mybatis-plus--配置-(sql)日志输出-自动填充-分页-多数据源-逻辑删除
写在前面: 本文主要介绍mybatis-plus的配置,以后在有的时候在补充。欢迎交流。 文章目录 日志输出自动填充分页全局字段配置多数据源 日志输出 调试的时候需要看执行的sql,这时候就很需要日志来记录查看了。 mybatis-plus的日志配置在yml…...
数据API服务管理功能:解放数据潜力,提升业务效率
数据API服务的重要性 在数字化时代,数据被认为是企业的重要资产。数据API服务的管理功能能够有效帮助企业实现数据的整合和利用。通过合理的数据API服务管理,企业可以更好地解放数据潜力,提升业务效率。 解放数据潜力 数据API服务管理功…...
云南森林火灾vr消防模拟安全演练系统训练消防员火灾和事故的适应和应对能力
据统计,每一场破坏性地震发生后,会引发次生的灾害,而火灾是其中之一。导致火灾的原因,推测是地震时使供电线路短路,引燃易燃物,火灾就随即发生。所以,在日常生活中,定期的消防演练还是非常必要的, VR消防,是VR公司深圳华锐视点利用VR虚拟现实技术,将VR和…...
(6)(6.2) 任务命令
文章目录 前言 6.2.1 概述 6.2.2 导航命令 6.2.3 条件命令 6.2.4 DO命令 前言 本文介绍了 Copter、Plane 和 Rover 切换到自动模式时支持的任务指令。 !Warning 这是一项正在进行中的工作,尚未经过全面审核。有关 Copter 的更佳列表,请…...
3步彻底解决Zotero文献库重复问题:Zotero Duplicates Merger插件终极指南
3步彻底解决Zotero文献库重复问题:Zotero Duplicates Merger插件终极指南 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 还在为Zo…...
实现Degrees of Lewdity游戏本地化:完整中文补丁安装教程
实现Degrees of Lewdity游戏本地化:完整中文补丁安装教程 本教程将指导您完成Degrees of Lewdity游戏的中文本地化过程,通过系统的游戏本地化方法,帮助您顺利安装中文补丁,解决游戏界面语言障碍,提升游戏体验。我们将…...
Halo Cursor:轻量级框架无关的动画光标库设计与实践
1. 项目概述:一个轻量、无框架绑定的动画光标库最近在重构一个前端项目,想给用户界面增加一点微妙的动态反馈,提升交互的精致感。我第一个想到的就是自定义光标效果。市面上这类库不少,但要么体积臃肿,要么和特定框架&…...
蓝桥杯嵌入式备赛:手把手教你用STM32G4的ADC读取光敏电阻(国信长天扩展板)
蓝桥杯嵌入式竞赛实战:STM32G4光敏电阻精准采集与优化策略 在蓝桥杯嵌入式竞赛中,环境光检测是高频考点之一。国信长天扩展板上的光敏电阻模块看似简单,但要在竞赛中稳定发挥,需要深入理解硬件电路设计原理、掌握ADC采集的优化技巧…...
如何用OBS插件打造专业音乐直播?Tuna插件完整指南
如何用OBS插件打造专业音乐直播?Tuna插件完整指南 【免费下载链接】tuna Song information plugin for obs-studio 项目地址: https://gitcode.com/gh_mirrors/tuna1/tuna 想让你的OBS直播画面瞬间升级为专业音乐电台风格吗?Tuna插件正是你需要的…...
n8n与Claude集成指南:构建AI代码生成与自动化执行工作流
1. 项目概述与核心价值最近在折腾自动化工作流时,我偶然发现了一个名为n8n-claude-code-guide的开源项目。这个项目乍一看名字,你可能以为它只是一个简单的代码指南,但深入探究后,你会发现它实际上是一个将两个强大的工具——n8n和…...
SAP ABAP BADI AC_DOCUMENT:跨越VF01/MIRO/AFAB的智能凭证替代实战
1. 为什么需要AC_DOCUMENT BADI? 在SAP标准业务流程中,GGB1提供的凭证替代功能已经能满足大部分常规需求。但实际业务往往更复杂——比如销售开票时,需要根据付款条件动态替换税科目;发票校验时,要根据供应商信息自动填…...
AI辅助编程工具Cursor在经济学研究中的应用与实战指南
1. 从零开始:为什么经济学家需要AI辅助编程工具 如果你是一名经济学研究者、研究生或者研究助理,我猜你肯定经历过这样的场景:为了清洗一份来自世界银行或国家统计局的复杂面板数据,你对着Stata或者R的代码文档反复调试࿰…...
MediaCreationTool.bat:革命性的Windows自动化部署解决方案
MediaCreationTool.bat:革命性的Windows自动化部署解决方案 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat …...
转转前端周刊第194期: 裁员潮将持续,直到我们学会发掘 AI 的商业价值
转转前端周刊本刊意在将整理业界精华文章给大家,期望大家一起打开视野1、裁员潮将持续,直到我们学会发掘 AI 的商业价值本文以亲历者视角切入 AI 裁员潮的现实焦虑,剖析了从 Coinbase 到 Square 等一系列"AI 裁员"事件背后的商业逻…...
