03-JAVA设计模式-建造者模式

建造者模式

什么是建造者模式

建造者模式(Builder Pattern)是一种对象构建的设计模式,它允许你通过一步一步地构建一个复杂对象,来隐藏复杂对象的创建细节。
这种模式将一个复杂对象的构建过程与其表示过程分离,使得同样的构建过程可以创建不同的表示。命名建议以Builder结尾,以达到见名之意。

在建造者模式中,通常包含以下几个角色:

  • 产品(Product):这是最终要创建的对象,它通常包含多个属性,并且可能具有复杂的内部结构。
  • 抽象建造者(Builder):这是一个接口或者抽象类,定义了创建产品所需的方法。这些方法通常是一系列设置产品属性的步骤。
  • 具体建造者(ConcreteBuilder):这个类实现了抽象建造者接口,提供了构建产品的具体实现。它包含了创建产品对象的所有逻辑,并可以一步步地设置产品对象的属性。
  • 导演者(Director):这是一个可选的角色,它负责调用建造者接口中的方法来构建产品对象。导演者可以简化客户端代码,使得客户端无需关心具体的构建步骤。

使用场景

  • 当我们要建造一个复杂的产品。比如:手机时。这种复杂产品的创建,需要处理子组件装配的问题。
  • 实际开发中,我们所需要的对象构建时也非常复杂,有很多步骤需要处理时。

建造者模式的本质

  • 分离了对象子组件的单独构造(有Buider来负责)和装配(有Director负责)。从而可以构造负责的对象。
  • 这个模式适用于在某个对象构建过程复杂的情况下使用。
  • 由于实现了构建和装配的解耦。不同的构建器,相同的装配,可以做出不同的对象; 相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。

案例

实现建造华为手机与小米手机

通过静态内部类作为建造者

Phone.java

public class Phone {// 机身private String fuselage;// 摄像头private String camera;// 系统内核private String systemKernel;// 私有构造方法,只能通过建造者创建private Phone(Builder builder) {this.fuselage = builder.fuselage;this.camera = builder.camera;this.systemKernel = builder.systemKernel;}@Overridepublic String toString() {return "Phone{" +"fuselage='" + fuselage + '\'' +", camera='" + camera + '\'' +", systemKernel='" + systemKernel + '\'' +'}';}// 静态内部类作为建造者static class Builder {// 机身private String fuselage;// 摄像头private String camera;// 系统内核private String systemKernel;public Builder setFuselage(String fuselage) {this.fuselage = fuselage;return this;    // 链式调用}public Builder setCamera(String camera) {this.camera = camera;return this;    // 链式调用}public Builder setSystemKernel(String systemKernel) {this.systemKernel = systemKernel;return this;    // 链式调用}// 创建手机public Phone createPhone(){return new Phone(this);}}
}

Client.java

public class Client {public static void main(String[] args) {Phone phone = new Phone.Builder().setCamera("华为摄像头").setFuselage("华为机身").setSystemKernel("鸿蒙系统").createPhone();System.out.println(phone);Phone phone2 = new Phone.Builder().setCamera("小米摄像头").setFuselage("小米机身").setSystemKernel("小米系统").createPhone();System.out.println(phone2);}
}

执行结果:

在这里插入图片描述

通过接口实现建造者模式

UML

在这里插入图片描述

不使用导演者

Phone.java

public class Phone {// 机身private String fuselage;// 摄像头private String camera;// 系统内核private String systemKernel;public void setFuselage(String fuselage) {this.fuselage = fuselage;}public void setCamera(String camera) {this.camera = camera;}public void setSystemKernel(String systemKernel) {this.systemKernel = systemKernel;}@Overridepublic String toString() {return "Phone{" +"fuselage=" + fuselage +", camera=" + camera +", systemKernel=" + systemKernel +'}';}
}

IPhoneBuider.java

// 手机 抽象建造者定义接口
public interface IPhoneBuider {// 设置机身IPhoneBuider setFuselage(String fuselage);// 设置摄像头IPhoneBuider setCamera(String camera);// 设置系统内核IPhoneBuider setSystemKernel(String systemKernel);// 返回创建对象Phone buildPhone();
}

PhoneBuilder.java

// 建造者具体实现
public class PhoneBuilder implements IPhoneBuider {// 定义建造者返回对象private Phone phone;public PhoneBuilder() {// 初始化Phonethis.phone = new Phone();}@Overridepublic IPhoneBuider setFuselage(String fuselage) {phone.setFuselage(fuselage);return this;}@Overridepublic IPhoneBuider setCamera(String camera) {phone.setCamera(camera);return this;}@Overridepublic IPhoneBuider setSystemKernel(String systemKernel) {phone.setSystemKernel(systemKernel);return this;}@Overridepublic Phone buildPhone() {return phone;}
}

TestClient2.java

public class TestClient2 {public static void main(String[] args) {// 创建建造具体建造者PhoneBuilder phoneBuilder = new PhoneBuilder();Phone phone = phoneBuilder.setCamera("装配小米摄像头").setFuselage("装配小米机身").setSystemKernel("装配小米系统").buildPhone();System.out.println(phone.toString());}
}

在这里插入图片描述

使用导演者

新增导演者
HuaweiDirector.java

// 华为手机导演者
public class HuaweiDirector {// 定义建造者属性private IPhoneBuider phoneBuider;public HuaweiDirector(IPhoneBuider phoneBuider) {this.phoneBuider = phoneBuider;}public Phone createPhone(){Phone phone = phoneBuider.setCamera("装配华为摄像头").setFuselage("装配华为机身").setSystemKernel("装配鸿蒙系统").buildPhone();return phone;}
}

TestClient.java

public class TestClient {public static void main(String[] args) {// 创建建造具体建造者PhoneBuilder phoneBuilder = new PhoneBuilder();// 创建导演者 传入具体建造者HuaweiDirector huaweiDirector = new HuaweiDirector(phoneBuilder);// 通过导演者构建手机Phone phone = huaweiDirector.createPhone();System.out.println(phone.toString());}
}

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

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

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

相关文章

跨站请求伪造漏洞(CSRF)

什么是CSRF CSRF(Cross-Site Request Forgery),也被称为 one-click attack 或者 session riding,即跨站请求伪造攻击。 漏洞原理 跨站请求伪造漏洞的原理主要是利用了网站对用户请求的验证不严谨。攻击者会在恶意网站中构造一个…

spring-cloud微服务openfeign

Spring Cloud openfeign对Feign进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Nacos,从而使得Feign的使用更加方便 优势,openfeign可以做到使用HTTP请求远程服务时就像洞用本地方法一样的体验,开发者完全感…

获取请求数据

假设有这样一个请求:http://localhost:8080/springmvc/register?namezhangsan&password123&emailzhangsanqq.com 在SpringMVC中应该如何获取请求提交的数据?在SpringMVC中又应该如何获取请求头信息?在SpringMVC中又应该如何获取客户…

搭建第一个Web服务器(在eclipse或idea上部署Tomcat服务器)

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

深入理解Linux系统中的前后台任务与守护进程

⭐小白苦学IT的博客主页 ⭐初学者必看:Linux操作系统入门 ⭐代码仓库:Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 在Linux系统中,进程管理是至关重要的一个环节。其中,前后台任务和守护进程是进程管理中不可忽视的两…

阿里云云效CI/CD配置

1.NODEJS项目流水线配置(vue举例) nodejs构建配置 官方教程 注意:下图的dist是vue项目打包目录名称,根据实际名称配置 # input your command here cnpm cache clean --force cnpm install cnpm run build 主机部署配置 rm -rf /home/vipcardmall/frontend/ mkdir -p /home/…

刷题之Leetcode707题(超级详细)

707.设计链表 力扣题目链接(opens new window)https://leetcode.cn/problems/design-linked-list/ 题意: 在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val)&#x…

Day37代码随想录(1刷) 动态规划

509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 n …

外包干了17天,技术倒退明显

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能…

局域网tcp通信实验

两台windows系统计算机简单TCP通信测试_两台计算机tcp通信-CSDN博客 使用这篇文章的小工具。 环境: 我和同学的两台笔记本电脑。 使用我的手机开热点,两台电脑连接热点。 我的: IPv4 地址 . . . . . . . . . . . . : 192.168.92.79 子…

Day04-SHELL自动化编程-循环与颜色函数库

Day04-SHELL自动化编程-循环与颜色函数库 11. 必知必会核心命令11.1 命令概述11.7 案例11.8 小结 12 Shell编程-循环12.1 循环概述12.2 for循环1)最常用的for循环格式2)c语言格式for循环3)for循环格式及应用场景4)案例 12.3 while…

【WSN覆盖优化】基于灰狼优化算法的无线传感器网络覆盖 GWO-WSN覆盖优化【Matlab代码#74】

文章目录 【可更换其他算法,获取资源请见文章第5节:资源获取】1. 灰狼优化算法2. WSN节点感知模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法,获取资源请见文章第5节:资源获取】 1. 灰狼优化算法 此处略。 2.…

【Java8新特性】四、强大的Stream api

​ 这里写自定义目录标题 一、了解Stream二、流(stream)到底是什么?三、Stream操作的三个步骤四、创建Stream的四种方式五、Stream 的中间操作1、筛选和切片2、map 映射3、排序 六、Stream 的终止操作1、查找和匹配2、归约3、收集 一、了解Stream Stream是Java8中…

spring容器

spring容器 实现方式 spring中提供了各式各样的IOC容器的实现供用户选择和使用,使用什么样的容器取决于用户的需要 BeanFactory 该接口是最简单的容器,提供了基本的DI支持。最常用的BeanFactory实现是XmlBeanFactory类,根据XML文件中的定义加…

idea常用配置

IDEA设置全局配置 参考:IDEA设置全局配置_idea如何打开一个项目,全局设置-CSDN博客 idea提交代码到git或svn上时,怎么忽略.class、.iml文件和文件夹等不必要的文件 参考:idea提交代码到git或svn上时,怎么忽略.class、.iml文件和文…

Python爬虫网络实践:去哪儿旅游数据爬取指南

Python爬虫网络实践:去哪儿旅游数据爬取指南 在这个博客中,我们将探索如何使用 Python 来进行网络数据抓取,并以抓取旅游数据为例进行演示。我们将通过一个简单的示例来说明如何利用 Python 中的常用库进行网页抓取,从而获取旅游…

软件详细设计说明书(套用案例)

2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4设计目标 2.5.1总体原则 2.5.2实用性和先进性 2.5.3标准化、开放性、兼容性 2.5.4高可靠性、稳定性 2.5.5易用性 2.5.6灵活性和可扩展性 2.5.7经济性和投资保护 3系统功能模块详细设计 3.1个人办公…

一键下载 M3U8 并转换为 MP4升级版

之前的下载 M3U8程序,有很多问题, 为此做了一些升级,分享给大家。 增加了存在播放列表的情况处理播放列表路径和ts路径错误问题多线程问题对于电视剧多文件下载的处理 这里从网上找了一部的链接,可以参考这个网站https://www.zu…

3 突破编程_前端_SVG(rect 矩形)

1 rect 元素的基本属性和用法 在SVG中&#xff0c;<rect> 元素用于创建矩形。 <rect> 元素有一些基本的属性&#xff0c;可以用来定义矩形的形状、位置、颜色等。以下是这些属性的详细解释&#xff1a; x 和 y &#xff1a;这两个属性定义矩形左上角的位置。 x …

Llama 3下月正式发布,继续开源!

4月10日&#xff0c;Techcrunch消息&#xff0c;Meta在本周伦敦举办的一场活动中确定&#xff0c;下个月将正式发布Llama 3并且继续开源。 Meta全球事务总裁Nick Clegg表示&#xff0c;我们希望在下个月&#xff0c;甚至更短的时间内&#xff0c;正式推出新一代基础模型Llama …