当前位置: 首页 > news >正文

JAVA设计模式之【建造者模式】

建造者模式.png

1 定义

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

2 类图

产品类(Product):表示被创建的复杂对象。它通常包含多个部分或者组成,并由具体的建造者逐步构建而成。
抽象建造者类(Builder):定义了建造复杂对象所需要的各个部分的创建方法。它通常包括多个构建方法和一个返回产品的方法。
具体建造者类(ConcreteBuilder):实现Builder接口,并提供各个部分或者组成的构建方法。
调用者(Director):负责控制建造者的构建顺序,指挥建造者如何构建复杂对象。

3 应用场景

生活中场景

去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。

java应用场景

  • StringBuilder(append()开放构造步骤,最后toString()构造)
  • Lombok的@Builder注解

使用场景

当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。

4 代码案例

基本写法

首先创建一个产品类Course

public class Course {private String name;private String ppt;private String video;private String note;private String homework;@Overridepublic String toString() {return "CourseBuilder{" +"name='" + name + '\'' +", ppt='" + ppt + '\'' +", video='" + video + '\'' +", note='" + note + '\'' +", homework='" + homework + '\'' +'}';}
}

创建一个建造者类CourseBuilder

public class CourseBuilder{private Course course = new Course();public void addName(String name) {course.setName(name);}public void addPPT(String ppt) {course.setPpt(ppt);}public void addVideo(String video) {course.setVideo(video);}public void addNote(String note) {course.setNote(note);}public void addHomework(String homework) {course.setHomework(homework);}public Course build() {return course;}
}

调用

public class Test {public static void main(String[] args) {CourseBuilder builder = new CourseBuilder();builder.addName("设计模式");builder.addPPT("【PPT课件】");builder.addVideo("【回放视频】");builder.addNote("【课堂笔记】");builder.addHomework("【课后作业】");System.out.println(builder.build());}
}

责任链写法

修改 建造者类CourseBuilder:

  • 将产品类Course变为建造者类的内部类。
  • 将构造部分添加进去,都返回CourseBuilder(this)对象
    代码如下:
public class CourseBuilder {private Course course = new Course();public CourseBuilder addName(String name) {course.setName(name);return this;}public CourseBuilder addPPT(String ppt) {course.setPpt(ppt);return this;}public CourseBuilder addVideo(String video) {course.setVideo(video);return this;}public CourseBuilder addNote(String note) {course.setNote(note);return this;}public CourseBuilder addHomework(String homework) {course.setHomework(homework);return this;}public Course build() {return this.course;}@Datapublic class Course {private String name;private String ppt;private String video;private String note;private String homework;@Overridepublic String toString() {return "CourseBuilder{" +"name='" + name + '\'' +", ppt='" + ppt + '\'' +", video='" + video + '\'' +", note='" + note + '\'' +", homework='" + homework + '\'' +'}';}}
}

5 与工厂模式区别

  1. 建造者模式注重new的过程,工厂模式注重new的结果
  2. 创建对象力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的对象都一样

6 优缺点

优点

  1. 封装好,创建和使用隔离
  2. 扩展性好,建造类之间独立,一定程度上解耦

缺点

  1. 产生多余的Builder对象

如简单的可直接在Product构造,而建造者模式需要多创建一个Builder对象

  1. Product内部发生变化,建造者都要修改

比如原本年龄属性是整数类型,现在改为了字符串类型表示,那么在建造者类中的设置年龄的方法就需要相应修改

v 搜【谷丘Coder】发送【建造者模式】获取笔记资料与思维导图

相关文章:

JAVA设计模式之【建造者模式】

1 定义 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 2 类图 产品类(Product):表示被创建的复杂…...

【jvm】为什么Xms和Xmx的值通常设置为相同的?

目录 1. 说明2. 避免性能开销3. 提升稳定性4. 简化配置5. 优化垃圾收集6. 获取参数6.1 代码示例6.2 结果示例 1. 说明 1.-Xms 和 -Xmx 参数分别用于设置堆内存的初始大小(最小值)和最大大小。2.在开发环境中,开发人员可能希望快速启动应用程…...

windows查看net网络监听端口命令和工具(ipconfig、netstat、tasklist、TCPView)

文章目录 使用命令提示符(CMD)查看网络连接和配置使用 netstat 命令查看监听端口查看特定的端口查看TCP监听端口tasklist查看对应进程ID的程序Get-NetTCPConnection 命令使用 TCPView工具使用命令提示符(CMD) 查看网络连接和配置 ipconfig :显示所有网络 适配器的当前 TC…...

JAVA-数据结构- 二叉搜索树

1.搜索树 前面我们已经使用C语言学习完了二叉树,懂得了一些二叉树的基本性质已经实现方法 https://mp.csdn.net/mp_blog/creation/editor/139572374,本文我们来一起进行二叉树的衍生-二叉搜索树 1.1 概念 二叉搜索树又称二叉排序树,它或者是…...

深入研究 RAG 流程中的关键组件

我们已经看到了整个RAG流程,并获得了第一手的实践经验,您可能会对RAG流程中一些组件的使用和目的存在很多疑惑,比如RunnablePassthrough。在本节中,我们将进一步了解这些关键组件。 RAG的核心模型思想是将一个复杂的任务分解为多…...

新手如何学习python并快速成为高手

英雄Python入门到精通链接:https://pan.quark.cn/s/57162ec366a9 学习Python作为新手,有以下几个步骤: 学习基本概念和语法:首先,你需要学习Python的基本概念和语法。可以通过在线教程、书籍或者视频教程来学习。了解…...

Linux历史命令history增加执行时间显示

Centos系统默认历史命令显示如下 为了更好的溯源,获取执行命令的准确时间,需要增加一些配置 设置环境变量 vim /etc/profile 在最下面添加以下环境配置 export HISTTIMEFORMAT"%Y-%m-%d %H:%M:%S " 立即刷新该环境变量 source /etc/pro…...

从 vue 源码看问题 — 你知道 Hook Event 吗?

前言 在之前的几篇文章中,都有提到 vue 中调用生命周期钩子时是通过 callHook() 方法进行调用的,比如在初始化篇章中调用 beforeCreate 和 created 生命周期钩子方式如下: 那么接下来一起来了解下到底什么是 Hook Event ? Hook Event 是什…...

信息安全工程师(68)可信计算技术与应用

前言 可信计算技术是一种计算机安全体系结构,旨在提高计算机系统在面临各种攻击和威胁时的安全性和保密性。 一、可信计算技术的定义与原理 可信计算技术通过包括硬件加密、受限访问以及计算机系统本身的完整性验证等技术手段,确保计算机系统在各种攻击和…...

每日OJ题_牛客_相差不超过k的最多数_滑动窗口_C++_Java

目录 牛客_相差不超过k的最多数_滑动窗口 题目解析 C代码 Java代码 牛客_相差不超过k的最多数_滑动窗口 相差不超过k的最多数_牛客题霸_牛客网 (nowcoder.com) 描述: 给定一个数组,选择一些数,要求选择的数中任意两数差的绝对值不超过 …...

来咯来咯webSocket

在项目总目录下 设置socketServe文件夹 里面创建下面两个文件 使用的时候需要开启 node webSocket.cjs var { Server } require(ws); var moment require(moment);const wss new Server({port: 8888 });let id 0; let onlineMemberList []; const defaultUser user;wss…...

Android CALL关于电话音频和紧急电话设置和获取

获取音频服务,设置音源类型:电话类型和获取最大电话音量,响铃模式 private AudioManager mAudioManager; mAudioManager (AudioManager) getSystemService(AUDIO_SERVICE); mAudioManager.setStreamVolume(AudioManager.STREAM_VOIC…...

【春秋云镜】CVE-2023-23752

目录 CVE-2023-23752漏洞细节漏洞利用示例修复建议 春秋云镜:解法一:解法二: CVE-2023-23752 是一个影响 Joomla CMS 的未授权路径遍历漏洞。该漏洞出现在 Joomla 4.0.0 至 4.2.7 版本中,允许未经认证的远程攻击者通过特定 API 端…...

C#-__DynamicallyInvokable

[__DynamicallyInvokable] 属性是用于 .NET Framework 中的特性之一。这个特性通常用于标记在动态语言运行时中可以进行调用的方法或属性。 当一个方法或属性被标记为 [__DynamicallyInvokable],它表明这个成员在动态语言的环境中是可调用的。换句话说,…...

2024年最新10款顶级项目管理软件排行

项目管理软件在现代项目管理中扮演着至关重要的角色,它不仅仅是一个工具,更是一种高效、系统化的方法来管理和优化项目流程,帮助项目经理和团队成员快速了解项目状态,加速项目进展。 进度猫 进度猫是一款以甘特图为向导的轻量级…...

Python NLTK进阶:深入自然语言处理

目录 Python NLTK进阶:深入自然语言处理 1. 文本处理技术 1.1 命名实体识别(NER) 1.2 共指消解 2. 语义分析 2.1 语义角色标注(SRL) 2.2 词义消歧(Word Sense Disambiguation) 3. 机器学…...

【React 的理解】

谈一谈你对 React 的理解 对待这类概念题,讲究一个四字口诀“概用思优”,即“讲概念,说用途,理思路,优缺点,列一遍” 。 React 是一个网页 UI 框架,通过组件化的方式解决视图层开发复用的问题&a…...

软件压力测试有多重要?北京软件测试公司有哪些?

软件压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。压力测试是给软件不断加压,强制其在极限的情况下运行,观察它可以运行到何种程度,从而发现性能缺陷。 在数字化时代,用户对软件性能的要求越…...

十四届蓝桥杯STEMA考试Python真题试卷第二套第五题

来源:十四届蓝桥杯STEMA考试Python真题试卷第二套编程第五题 本题属于迷宫类问题,适合用DFS算法解决,解析中给出了Python中 map() 和列表推导式的应用技巧。最后介绍了DFS算法的两种常见实现方式——递归实现、栈实现,应用场景——迷宫类问题、图的连通性、树的遍历、拓朴排…...

虚拟机 Ubuntu 扩容

文章目录 一、Vmware 重新分配 Ubuntu 空间二、Ubuntu 扩容分区 一、Vmware 重新分配 Ubuntu 空间 先打开 Vmware ,选择要重新分配空间的虚拟机 点击 编辑虚拟机设置 ,再点击 硬盘 ,再点击 扩展 选择预计扩展的空间,然后点击 扩展…...

【STM32 C 语言入门】什么是强制类型转换?小白也能秒懂!

一、什么是强制类型转换?一句话讲透 强制类型转换,就是“强行把一种数据类型,变成另一种数据类型”。 打个比方: 你手里拿着一个苹果(int类型)但函数只收橙子(枚举类型)强制类型转换…...

人工智能通识课:深度学习框架 PyTorch

深度学习框架是连接算法理论与工程实践的重要工具。它让开发者不必从零实现张量运算、自动求导、参数更新、GPU 调度和模型保存等底层细节,而可以把主要精力放在数据处理、模型结构设计、训练策略和实验验证上。在众多深度学习框架中,PyTorch 凭借直观的…...

DeepSeek混合云架构下跨AZ流量调度困局:基于eBPF+Service Mesh的实时负载感知调度器设计(已上线支撑日均2.7亿QPS)

更多请点击: https://codechina.net 第一章:DeepSeek混合云架构下跨AZ流量调度困局的系统性认知 在DeepSeek混合云生产环境中,核心推理服务部署于多可用区(AZ)集群,底层横跨公有云(如AWS us-ea…...

AI Agent Harness Engineering 的能耗问题:绿色 AI 与推理成本的平衡艺术

AI Agent Harness Engineering 的能耗问题:绿色 AI 与推理成本的平衡艺术 摘要 随着自主 AI Agent 系统从实验性原型向生产级应用(如智能客服中心、智慧城市协同调度、工业机器人集群)的大规模渗透,传统以模型精度为核心的优化范式已无法满足可持续发展与商业可行性的双重…...

Wireshark实战识别与防御ARP欺骗攻击

1. 为什么ARP欺骗不是“黑客电影”里的特效,而是你每天都在裸奔的真实风险 很多人第一次听说ARP欺骗,是在某部电影里看到主角敲几行命令,对面电脑就突然断网、弹出奇怪窗口、甚至开始自动转账——然后心里一紧:“这玩意儿真能这么…...

告别驱动精灵!手把手教你用设备管理器手动修复声卡驱动(以英特尔智音技术为例)

告别驱动精灵!手把手教你用设备管理器手动修复声卡驱动(以英特尔智音技术为例)当笔记本突然失去声音,右下角的小喇叭图标显示红色叉号时,多数人的第一反应是下载各种驱动助手。但你是否想过,Windows自带的设…...

电脑里突然冒出的FNPLicensingService.exe是啥?手把手教你关闭它(附Adobe/CAD/Xshell等软件排查指南)

电脑里突然冒出的FNPLicensingService.exe是啥?手把手教你关闭它(附Adobe/CAD/Xshell等软件排查指南)当你打开任务管理器,突然发现一个陌生的进程FNPLicensingService.exe在后台运行,甚至频繁请求联网,这难…...

Java中的Comparator 和JS中的回调函数好相似

Comparator 在 Java 中的地位,非常像 JavaScript 中 Array.prototype.sort() 那个接收的 回调函数 (Comparison Function)。1. Comparator 是什么?在 Java 中,Comparator 是一个接口,它的核心作用是定义“比较逻辑”。在 Java 8 之…...

告别电脑休眠烦恼:MouseJiggler鼠标抖动工具完全指南

告别电脑休眠烦恼:MouseJiggler鼠标抖动工具完全指南 【免费下载链接】mousejiggler Mouse Jiggler is a very simple piece of software whose sole function is to "fake" mouse input to Windows, and jiggle the mouse pointer back and forth. 项目…...

Windows 11硬件限制绕过终极指南:让不支持的设备完美运行最新系统

Windows 11硬件限制绕过终极指南:让不支持的设备完美运行最新系统 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.ba…...