Java设计模式 —— 【创建型模式】建造者模式详解

文章目录

  • 一、建造者模式
  • 二、案例实现
  • 三、优缺点
  • 四、模式拓展
  • 五、对比
    • 1、工厂方法模式VS建造者模式
    • 2、抽象工厂模式VS建造者模式


一、建造者模式

  1. 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。
  2. 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。
  3. 建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
  4. 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
    在这里插入图片描述

建造者(Builder)模式包含如下角色:

  1. Product(产品角色): 要创建的复杂对象。
  2. Builder(抽象建造者):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。
  3. ConcreteBuilder(具体建造者):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。
  4. Director(指挥者): 调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

二、案例实现

以生产手机为例:

Builder(抽象建造者):定义手机需要那些配件
具体建造者:定义不同手机配件的生产标准
Director(指挥者):定义手机需要组装什么配件,按照什么顺序进行组装

在这里插入图片描述
产品角色(Phone):

public class Phone {private String cpu;private String memory;private String colour;public void setCpu(String cpu) {this.cpu = cpu;}public void setMemory(String memory) {this.memory = memory;}public void setColour(String colour) {this.colour = colour;}@Overridepublic String toString() {return "Phone{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", colour='" + colour + '\'' +'}';}
}

抽象建造者(Builder):

public abstract class Builder {protected Phone phone = new Phone();public abstract void buildCpu();public abstract void buildMemory();public abstract void buildColour();public Phone builder(){return phone;}
}

具体建造者(XiaoMi,HuaWei):

public class XiaoMi extends Builder {@Overridepublic void buildCpu() {phone.setCpu("天机");}@Overridepublic void buildMemory() {phone.setMemory("256");}@Overridepublic void buildColour() {phone.setColour("白色");}
}

public class HuaWei extends Builder {@Overridepublic void buildCpu() {phone.setCpu("麒麟");}@Overridepublic void buildMemory() {phone.setMemory("512");}@Overridepublic void buildColour() {phone.setColour("黑色");}
}

指挥者(Director):

public class Director {private Builder builder;public void setBuilder(Builder builder){this.builder = builder;}public Phone createPhone() {builder.buildCpu();builder.buildMemory();builder.buildColour();return builder.builder();}
}

测试:

public class Demo {public static void main(String[] args) {Director director = new Director();director.setBuilder(new XiaoMi());Phone xiaoMi = director.createPhone();System.out.println("XiaoMi: " + xiaoMi);director.setBuilder(new HuaWei());Phone huaWei = director.createPhone();System.out.println("HuaWei: " + huaWei);}
}

在这里插入图片描述


三、优缺点

优点:

  • 建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在指挥者类中对整体而言可以取得比较好的稳定性。
  • 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
  • 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
  • 建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。符合开闭原则。

缺点:

造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。


四、模式拓展

建造者模式除了上面的用途外,在开发中还有一个常用的使用方式,就是当一个类构造器需要传入很多参数时,如果创建这个类的实例,代码可读性会非常差,而且很容易引入错误,此时就可以利用建造者模式进行重构。

比如上述案例中,手机又要定制摄像头,屏幕,电池等等,使用构造方法创建对象,代码的可读性及使用的成本就是比较高。

我们对代码进行优化:

public class Phone {private String cpu;private String memory;private String colour;private Phone(Builder builder) {cpu = builder.cpu;memory = builder.memory;colour = builder.colour;}public static class Builder {private String cpu;private String memory;private String colour;public Builder() {}public Builder cpu(String val) {cpu = val;return this;}public Builder memory(String val) {memory = val;return this;}public Builder colour(String val) {colour = val;return this;}public Phone build() {return new Phone(this);}}@Overridepublic String toString() {return "Phone{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", colour='" + colour + '\'' +'}';}
}
public class Demo {public static void main(String[] args) {Phone phone = new Phone.Builder().cpu("天玑").memory("256").colour("白色").build();System.out.println(phone);}
}

五、对比

1、工厂方法模式VS建造者模式

  • 工厂方法模式注重的是整体对象的创建方式;而建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造创建出一个复杂的对象。

  • 我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方法模式,直接产生出来的就是一个力大无穷、能够飞翔、内裤外穿的超人;而如果使用建造者模式,则需要组装手、头、脚、躯干等部分,然后再把内裤外穿,于是一个超人就诞生了。

  • 如果用工厂方法建造手机的话,直接就可以得到一个完整的手机,而用建造者模式,则需要按照指定顺序组装各个零件,才能得到一部手机。

2、抽象工厂模式VS建造者模式

  • 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。

  • 建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品。

  • 如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车。

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

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

相关文章

泷羽sec学习打卡-brupsuite4

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-proxy proxyInterceptHTTP history/WebSocket history(历史记录&a…

redis数据结构和内部编码及单线程架构

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. 数据结构和内部编码 Redis会在合适的场景选择合适的内部编码 我们可以通过objectencoding命令查询内部编码 : 2. 单线程架构 …

旅游管理系统的设计与实现

文末获取源码和万字论文,制作不易,感谢点赞支持。 毕 业 设 计(论 文) 题目:旅游管理系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候&#…

AIGC 与艺术创作:机遇

目录 一.AIGC 的崛起与艺术领域的变革 二.AIGC 在不同艺术形式中的应用 1.绘画与视觉艺术 2.音乐创作 三.AIGC 为艺术创作带来的机遇 1.激发创意灵感 2.提高创作效率 总结 在当今数字化时代,人工智能生成内容(AIGC)正以惊人的速度重塑…

Linux下的编程

实验7 Linux下的编程 一、实验目的 熟练掌握Linux下Python编程的方法、函数调用方法以及shell编程中的控制结构。 二、实验环境 硬件:PC电脑一台,网络正常。 配置:win10系统,内存大于8G ,硬盘500G及以上。 软件&a…

「Mac畅玩鸿蒙与硬件43」UI互动应用篇20 - 闪烁按钮效果

本篇将带你实现一个带有闪烁动画的按钮交互效果。通过动态改变按钮颜色,用户可以在视觉上感受到按钮的闪烁效果,提升界面互动体验。 关键词 UI互动应用闪烁动画动态按钮状态管理用户交互 一、功能说明 闪烁按钮效果应用实现了一个动态交互功能&#xf…

智能安全新时代:大语言模型与智能体在网络安全中的革命性应用

一、引言 随着信息技术的飞速发展,网络安全问题日益严重,成为各行各业面临的重大挑战。传统的安全防护措施已难以应对日益复杂的网络威胁,人工智能(AI)技术的引入为网络安全带来了新的希望。特别是大语言模型&#xff…

深度学习(2)前向传播与反向传播

这一次我们重点讲解前向传播与反向传播,对这里还是有点糊涂 前向传播(Forward Propagation)和反向传播(Backward Propagation)是深度学习中神经网络训练的核心过程。它们分别负责计算神经网络的输出以及更新神经网络的…

数据结构——图(遍历,最小生成树,最短路径)

目录 一.图的基本概念 二.图的存储结构 1.邻接矩阵 2.邻接表 三.图的遍历 1.图的广度优先遍历 2.图的深度优先遍历 四.最小生成树 1.Kruskal算法 2.Prim算法 五.最短路径 1.单源最短路径--Dijkstra算法 2.单源最短路径--Bellman-Ford算法 3.多源最短路径--Floyd-…

SSM报错:表现层方法应该返回字符串,但是返回页面

在进行SSM项目时,后端表现层应该返回给前端字符串,但是却跳转页面 1.首先检查是否使用ResponseBody注解 ResponseBody注解 作用:将java对象转为json格式的数据。将controller的方法返回的对象通过适当的转换器转换为指定的格式之后&#xff0…

【openGL入门(一)】

openGL入门(一) OpenGL(Open Graphics Library)GLAD & GLFW通过代码片段滤清流程1. 画面绘制基础2.VAO,VBO,EBO(1) VAO : Vertex Array Object(2) VBO: Vertex Buffer ObjectEBO:Element Buffer Object 总结 OpenG…

DAY2 C++基础补充

作业1: 已知一个数组table,用宏定义求出数组元素的个数。 #define NUM sizeof(table)/sizeof(table[0]) 作业2: 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit3,第…

图像滤波和卷积的不同及MATLAB应用实例

滤波与卷积在图像处理中都是非常重要的运算,但它们有着明显的区别。以下是滤波与卷积的主要不同点,并附带一个MATLAB实例来展示两者在图像处理中的效果差异。 一、滤波与卷积的不同 定义与目的: 1)滤波:滤波是一种信…

SpringBoot整合knife4j,以及会遇到的一些bug

这篇文章主要讲解了“Spring Boot集成接口管理工具Knife4j怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Boot集成接口管理工具Knife4j怎么用”吧! 一…

回归任务与分类任务应用及评价指标

能源系统中的回归任务与分类任务应用及评价指标 一、回归任务应用1.1 能源系统中的回归任务应用1.1.1 能源消耗预测1.1.2 负荷预测1.1.3 电池健康状态估计(SOH预测)1.1.4 太阳能发电量预测1.1.5 风能发电量预测 1.2 回归任务中的评价指标1.2.1 RMSE&…

在Ubuntu上使用IntelliJ IDEA:开启你的Java开发之旅!

你好,年轻的学徒!🧑‍💻 是时候踏上进入Java开发世界的史诗之旅了,我们的得力助手将是强大的IntelliJ IDEA。准备好了吗?出发吧! 在我们开始之前,我们需要下载这个工具。但是&#…

Burp入门(7)-APP抓包

声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址:burpsuite(5)web网页端抓包与app渗透测试_哔哩哔哩_bilibili 本文详细介绍如何使用burp suite去抓取APP的数据包。 一、安装 Burp 的 CA 证书 1…

【AI+网络/仿真数据集】1分钟搭建云原生端到端5G网络

导语: 近期智慧网络开放创新平台上线了端到端网络仿真能力,区别于传统的网络仿真工具需要复杂的领域知识可界面操作,该平台的网络仿真能力主打一个小白友好和功能专业。 https://jiutian.10086.cn/open/​jiutian.10086.cn/open/ 端到端仿…

学习实验室—招投标实务

在如今业务为王的市场竞争中,招投标的成功率不仅仅取决于方案的质量,更多的是一些“隐形”的诀窍和经验。许多成功的背后,往往隐藏着那些别人不愿提及的细节与技巧。突破盲点,往往意味着“知道与不知道”的差距。 今天&#xff0…

ElasticSearch7.8学习笔记

1. ElasticSearch概述 1.1 ElasticSearch是什么 Elaticsearch,简称为 ES,ES 是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到…