趣解建造者模式之网红小王购车记

一、前言

本文章是关于设计模式中的建造者模式的,也称构建者模式/生成器模式,英文我们称之为Builder Pattern。在开展讲解之前,我们先把该模式的定义了解一下。

建造者模式的定义:

该模式可以实现产品的封装构造过程,并允许按步骤构造产品。

该模式的优点:

可以将一个复杂对象的创建过程封装起来,允许对象通过多个步骤来创建,并且可以改变过程;它也可以向客户隐藏产品内部的表现;因为客户只看到一个抽象接口,所以产品的具体实现是可以被替换的。

用途:

经常被用来创建组合结构。

缺点:

与工厂模式相比,采用生成器模式创建对象的客户,需要具备更多的领域知识。

二、讲个小故事

小王家境一般,但是呢,通过自己的努力成为了一个小网红,收入也逐渐多了起来。他从小就羡慕开汽车的人,所以,自己也决定买辆车。

他首先去了奥迪的4s店,车子很多,也很不错。4S店的销售人员给他介绍了很多车型,他看中了奥迪的A4L,各方面都挺喜欢的,然后就打算付款了。

正在这个时候,他的助理给他打电话,“小王!榜一大哥准备签约你了!签约费用给你1000万!你发达了!”,小王一听,高兴坏了,这不一下子鸡窝变凤凰了嘛!他挂断电话,觉得自己得买一辆更独特的汽车,而不是大街上较为常见的A4L了,然后他问销售人员,这个车我能自己定制不?销售人员说,我们只有一些选配项,定制不了。小王很失望,他太想拥有一辆“专属”自己的车子了。

这个时候,销售人员建议他,去看一看保时捷,定制的项目非常多。然后呢,他就去了保时捷4s店,从那边他发现,从小的轮毂logo,再到外观中控,都能选配和定制,这就太好了,他选了好多自己喜欢的定制型,这样,一辆完完全全“专属”小王的保时捷跑车就定制好了。

三、模式的使用方式

从上面的例子我们可以看到,对于普通汽车来说,大多采用固定的一些配置项,我们获得的汽车往往没有特殊化定制的需求,那么这种情况,我们通过工厂方法或者抽象工厂就可以满足需求。

但是对于高端客户,往往需要定制化的东西比较多,那么创建出来的实例对象也更为复杂和灵活,对于这种场景,我们就可以通过Builder模式来进行对象的创建了。

所以,当我们需要自定义各种对象的细节部分,然后最终拼装出一个个性化实例对象时,就非常适合采用建造者模式。

获得一个车架子,拼装车门,拼装轮胎,拼装发动机,拼装变速箱……,然后获得最终的个性化汽车。

3.1> 类图

在通过上面的例子了解了建造者模式之后,我们就通过类图的方式,展示一下该模式。在下图中,我们提供了两种场景:分别是客户不可定制客户可以定制,具体选择哪种实现方式,可以根据具体的业务场景来自行选择:

3.2> 代码实现

创建一个汽车实体类Car,里面包含4个组件,分别是:汽车引擎(engine)、变速齿轮(gear)、车门(door)和汽车轮胎(wheel),代码如下所示:

@ToString
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Car {private String engine = "普通标准的发动机";private String gear = "普通标准的齿轮";private String door = "普通标准的车门";private String wheel = "普通标准的轮胎";
}

创建构造器接口Builder,提供安装引擎(initalEngine)、安装齿轮(initalGear)、安装车门(initalDoor)、安装轮胎(initailWheel)等功能:

public interface Builder {// 安装引擎Builder initalEngine(String engine);// 安装齿轮Builder initalGear(String gear);// 安装车门Builder initalDoor(String door);// 安装轮胎Builder initailWheel(String wheel);// 获得构建后的汽车Car getCar();
}

根据Builder接口,实现创建奥迪车的Builder实现类——AudiBuilder:

public class AudiBuilder implements Builder {private Car car;public AudiBuilder() {car = new Car("Audi普通的发动机","Audi普通标准的齿轮","Audi普通标准的车门","Audi普通标准的轮胎");}@Overridepublic Builder initalEngine(String engine) {car.setEngine(engine);return this;}@Overridepublic Builder initalGear(String gear) {car.setGear(gear);return this;}@Overridepublic Builder initalDoor(String door) {car.setDoor(door);return this;}@Overridepublic Builder initailWheel(String wheel) {car.setWheel(wheel);return this;}@Overridepublic Car getCar() {return car;}
}

根据Builder接口,实现创建宝马车的Builder实现类——BMWBuilder:

public class BMWBuilder implements Builder {private static Car car = new Car("BMW普通的发动机", "BMW普通标准的齿轮", "BMW普通标准的车门","BMW普通标准的轮胎");@Overridepublic Builder initalEngine(String engine) {car.setEngine(engine);return this;}@Overridepublic Builder initalGear(String gear) {car.setGear(gear);return this;}@Overridepublic Builder initalDoor(String door) {car.setDoor(door);return this;}@Overridepublic Builder initailWheel(String wheel) {car.setWheel(wheel);return this;}@Overridepublic Car getCar() {return car;}
}

创建工人类Worker,这个工人可以创建奥迪A4L型号汽车(createA4LCar)和奥迪R8跑车(createR8Car),也可以创建普通的宝马汽车(createCommonBMW):

public class Worker {Car createA4LCar() {return new AudiBuilder().initalEngine("Audi的4缸发动机").initalGear("6速双离合变速箱").getCar();}Car createR8Car() {return new AudiBuilder().initalEngine("16缸跑车引擎").initalDoor("碳纤维轻量级车门").initalGear("7档湿式双离合变速箱").initailWheel("米其林Top2竞速级轮胎").getCar();}Car createCommonBMW() {return new BMWBuilder().getCar();}
}

创建测试类BuilderTest,使得工人创建奥迪A4L、奥迪R8跑车和普通的宝马汽车:

public class BuilderTest {public static void main(String[] args) {Worker worker = new Worker();Car audiR8 = worker.createR8Car();Car audiA4L = worker.createA4LCar();Car commonBMW = worker.createCommonBMW();System.out.println("audiR8=" + audiR8);System.out.println("audiA4L=" + audiA4L);System.out.println("commonBMW=" + commonBMW);}
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

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

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

相关文章

浅谈视频汇聚平台EasyCVR中AI中台的应用功能

AI中台是将人工智能技术如深度学习、计算机视觉、知识图谱、自然语言理解等模块化,集约硬件的计算能力、算法的训练能力、模型的部署能力、基础业务的展现能力等人工智能能力,结合中台的数据资源,封装成整体中台系统。 在EasyCVR视频共享融合…

【AI】数学基础——高数(积分部分)

高数(函数&微分部分) 文章目录 1.4 微积分1.4.1 基本思想1.4.2 定积分定义定义计算定积分定积分性质定理N-L公式泰勒公式麦克劳林公式 1.5 求极值1.5.1 无条件极值1.5.2 条件极值1.5.3 多条件极值1.5.4 凹函数与凸函数 1.4 微积分 用于求解速度、面积…

vue3+ts+tinynce富文本编辑器+htmlDocx+file-saver 配合实现word下载

vue3 请下载html-docx-js-typescript,否则会报错类型问题 //报告导出word import * as htmlDocx from "html-docx-js-typescript";//ts-ignore import { saveAs } from file-saver// 下载文件, const downloadFile (row)> {try {const co…

得物一面,场景题问得有点多!

题目来源:https://www.nowcoder.com/discuss/525371909735792640 前文 本期是【捞捞面经】系列文章的第 1 期,持续更新中…。 《捞捞面经》系列正式开始连载啦,据说看了这个系列的朋友都拿到了大厂offer~ 欢迎星标订阅,持续更新…

服务器端使用django websocket,客户端使用uniapp 请问服务端和客户端群组互发消息的代码怎么写的参考笔记

2023/8/29 19:21:11 服务器端使用django websocket,客户端使用uniapp 请问服务端和客户端群组互发消息的代码怎么写 2023/8/29 19:22:25 在服务器端使用Django WebSocket和客户端使用Uniapp的情况下,以下是代码示例来实现服务器端和客户端之间的群组互发消息。 …

Redis——》Pipeline

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

15-mongodb

一、 MongoDB 简介 1 什么是 MongoDB MongoDB 是一个基于分布式文件存储的数据库。由 C语言编写。在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系…

ChatGPT⼊门到精通(4):ChatGPT 为何⽜逼

⼀、通⽤型AI 在我们原始的幻想⾥,AI是基于对海量数据的学习,锻炼出⼀个⽆所不知⽆所不能的模 型,并借助计算机的优势(计算速度、并发可能)等碾压⼈类。 但我们⽬前的AI,不管是AlphaGo还是图像识别算法&am…

生活类书单视频如何做?几个步骤轻松拿捏

生活类书单视频是一种很受欢迎的内容形式,它可以帮助观众了解各种生活类书籍,并提供一些有用的信息。在制作生活类书单视频时,我们需要注意几个步骤,以确保视频内容的质量和专业性。 首先,我们需要选择适合的书单背景。…

R语言绘图相关函数(含实例)

目录 plot:可用于创建多种类型的图形 dev.new():新建画板 hist:绘制直方图 dotchart:绘制点图的函数 pie:绘制饼图 pair:绘制散点图矩阵 boxplot:绘制箱线图 scatterplot3D: 绘制三维散点图 par:修…

Maven导入包

有些时候maven导入不进去包,这个时候可以去直接去maven仓库找到你需要的包 https://mvnrepository.com/ 在自己本地输入命令 (这只是一个样例,请根据自己需要的包参考) mvn install:install-file -Dfile"C:/Users//Downloa…

【Docker】Docker网络与存储(三)

前言: Docker网络与存储的作用是实现容器之间的通信和数据持久化,以便有效地部署、扩展和管理容器化应用程序。 文章目录 Docker网络桥接网络容器之间的通信 覆盖网络创建一个覆盖网络 Docker存储卷 总结 Docker网络 Docker网络是在容器之间提供通信的机…

Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】

一、Sentinel整合openfeign 1、复制一下order-openfeign项目(创建order-openfeign-sentinel) 然后在stock-nacos当中编写对应的接口 RequestMapping("/reduct2")public String reduct2(){int a 1/0;System.out.println("扣减库存"…

使用安全复制命令scp在Windows系统和Linux系统之间相互传输文件

现在已经有很多远程控制服务器的第三方软件平台,比如FinalShell,MobaXterm等,半可视化界面,使用起来非常方便和友好,两个系统之间传输文件直接拖就行,当然也可以使用命令方式在两个系统之间相互传递。 目录…

计算机毕设 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点&a…

AndroidStudio3.5.2修改项目项目包名

公司项目要打造成产品进行演示,需要更换不同的包名进行安装在同一设备上,即所谓的马甲包 更改步骤基本一样 https://blog.csdn.net/qq_35270692/article/details/78336049 需要注意的是,按照上边的步骤修改完后,如果项目中有数据…

秒懂算法2

视频链接 : 希望下次秒懂的是算法题_哔哩哔哩_bilibili P1094 [NOIP2007 普及组] 纪念品分组 原题链接 : [NOIP2007 普及组] 纪念品分组 - 洛谷 思路 : 排序 贪心 双指针首先先对输入进来的数组进行排序(由小到大)运用贪心的思想 : 前后结合,令l1,rn,若a[l]a[r]<w…

开发智能应用的新范式:大数据、AI和云原生如何构建智能软件

文章目录 1.利用大数据实现智能洞察2. 集成人工智能和机器学习3. 云原生架构的弹性和灵活性4. 实现实时处理和响应5. 数据安全和隐私保护6. 可解释性和透明性7. 持续创新和迭代8. 数据伦理和合规性 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &a…

macOS使用命令行连接Oracle(SQL*Plus)

Author: histonevonzohomail.com Date: 2023/08/25 文章目录 SQL\*Plus安装下载环境配置 SQL\*Plus远程连接数据库参考文献 原文地址&#xff1a;https://histonevon.top/archives/oracle-mac-sqlplus数据库安装&#xff1a;Docker安装Oracle数据库 (histonevon.top) SQL*Plus…

安防视频监控/视频集中存储/云存储平台EasyCVR无法播放HLS协议该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…