【HeadFirst系列之HeadFirst设计模式】第16天之生成器模式(Builder Pattern):让对象构建更优雅!

🚀 生成器模式(Builder Pattern):让对象构建更优雅!

“遇到复杂对象构建?试试生成器模式!”

在日常开发中,我们经常会遇到 创建对象属性过多、构造方法过长、可选参数混乱 的问题。这时候,我们就需要 生成器模式(Builder Pattern) 来简化对象的创建过程,让代码更加清晰、可维护。

本篇文章基于 《Head First 设计模式》,带你深入理解 生成器模式的核心思想、应用场景、优缺点,以及在 JDK 和 Spring 框架中的实践,并提供 Java 代码示例,助你高效掌握这一重要设计模式!🚀


🎭 先看问题:对象创建的痛点

假设我们有一个 复杂的 Product,有多个可选参数:

public class Product {private String name;private double price;private String manufacturer;private String category;private int stock;public Product(String name, double price, String manufacturer, String category, int stock) {this.name = name;this.price = price;this.manufacturer = manufacturer;this.category = category;this.stock = stock;}
}

❌ 遇到的问题

1️⃣ 构造方法参数过多,调用时容易混淆

Product product = new Product("Laptop", 999.99, "Apple", "Electronics", 100);

如果参数顺序错了,比如把 pricestock 位置写反,就会导致 难以发现的 Bug

2️⃣ 不支持部分参数可选
比如,有些 Product 可能不需要 manufacturer,但是 Java 没有默认参数,我们只能重载多个构造方法,导致代码臃肿:

public Product(String name, double price, String category) {this(name, price, "Unknown", category, 0);
}

3️⃣ 可读性差,扩展困难
如果后续增加新属性,比如 discount(折扣),就需要 修改所有构造方法,破坏了开闭原则(OCP)


🎯 解决方案:引入生成器模式

生成器模式(Builder Pattern) 通过 链式调用分步骤构造,让对象创建更加优雅!

1️⃣ 设计 ProductBuilder

public class Product {private String name;private double price;private String manufacturer;private String category;private int stock;// 私有构造函数,防止直接创建对象private Product(ProductBuilder builder) {this.name = builder.name;this.price = builder.price;this.manufacturer = builder.manufacturer;this.category = builder.category;this.stock = builder.stock;}// 静态内部类:Builderpublic static class ProductBuilder {private String name;private double price;private String manufacturer = "Unknown"; // 默认值private String category = "General"; // 默认值private int stock = 0;public ProductBuilder(String name, double price) {this.name = name;this.price = price;}public ProductBuilder manufacturer(String manufacturer) {this.manufacturer = manufacturer;return this;}public ProductBuilder category(String category) {this.category = category;return this;}public ProductBuilder stock(int stock) {this.stock = stock;return this;}public Product build() {return new Product(this);}}
}

2️⃣ 使用 Builder 模式创建对象

Product product = new Product.ProductBuilder("Laptop", 999.99).manufacturer("Apple").category("Electronics").stock(100).build();

✅ 生成器模式的优势

🔹 避免构造方法参数混乱,可读性更强
🔹 支持可选参数,避免构造方法重载
🔹 易于扩展,添加新字段不影响已有代码
🔹 支持链式调用,代码更加优雅


🎯 生成器模式的适用场景

创建复杂对象(参数过多、可选参数多的对象)
对象不可变(比如 String,创建后不可修改)
避免构造方法重载(减少代码膨胀)
提高代码可读性(链式调用,清晰直观)


🔍 生成器模式在 JDK 和 Spring 框架中的应用

📌 1. JDK 中的应用:StringBuilder

StringBuilder 采用 生成器模式 来高效拼接字符串:

String result = new StringBuilder().append("Hello ").append("World!").toString();

相比 String不可变性StringBuilder 避免了不必要的对象创建,提高了性能!

📌 2. Spring 框架中的应用:BeanDefinitionBuilder

在 Spring 中,BeanDefinitionBuilder 也是典型的 生成器模式 实现:

BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(MyService.class).addPropertyValue("name", "Spring Service").setScope(BeanDefinition.SCOPE_SINGLETON).getBeanDefinition();

🔹 可选参数不强制填充,避免复杂构造方法
🔹 链式调用,简洁清晰


🎯 生成器模式 vs 工厂模式

对比项生成器模式(Builder)工厂模式(Factory)
作用构造复杂对象,控制构造过程创建对象,封装 new 过程
是否支持可选参数✅ 支持❌ 不支持
是否支持链式调用✅ 支持❌ 不支持
使用场景复杂对象创建,参数多只需创建对象,逻辑简单

📌 什么时候用?

  • 参数少,逻辑简单工厂模式
  • 参数多,构造复杂生成器模式

🎉 总结

生成器模式(Builder Pattern) 解决了 构造方法参数混乱、可选参数处理困难、扩展性差 等问题,适用于 创建复杂对象

📌 核心要点:
✔️ 将对象构造过程与对象本身分离
✔️ 支持链式调用,避免构造方法重载
✔️ 可读性高,易扩展,适用于可选参数多的场景
✔️ 在 JDK(StringBuilder)、Spring(BeanDefinitionBuilder)中广泛应用

如果你正在开发 配置类、数据库连接类、复杂的实体类,不妨试试 生成器模式,让你的代码更加优雅!💡


💬 你在开发中遇到过哪些对象创建的痛点?欢迎在评论区交流! 🚀

👉 觉得有用?欢迎点赞 + 关注,更多设计模式干货持续更新! 💡

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

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

相关文章

HTML 编辑器推荐与 VS Code 使用教程

在进行 HTML 编程时,选择一款合适的 HTML 编辑器能极大地提高开发效率。以下为大家推荐几款常用且功能强大的 HTML 编辑器,同时详细介绍如何使用 VS Code 创建和预览 HTML 文件。 一、HTML 编辑器推荐 VS Code:由微软开发,是一款…

Kubernetes开发环境minikube | 开发部署apache tomcat web集群应用

minikube是一个主要用于开发与测试Kubernetes应用的运行环境,本文主要描述在minikube运行环境中部署J2EE tomcat web应用。 单节点Node多Pod实例部署 如上所示,在minikube运行的Linux部署环境中启动单节点Node 如上所示,在minikube的容器环境…

STM32---FreeRTOS中断管理试验

一、实验 实验目的:学会使用FreeRTOS的中断管理 创建两个定时器,一个优先级为4,另一个优先级为6;注意:系统所管理的优先级范围 :5~15 现象:两个定时器每1s,打印一段字符串&#x…

永磁直驱式风力发电虚拟同步机仿真模型Matlab/Simulink模型

很久没有分享虚拟同步机控制相关的方向了,毕业后在电科院的项目又有所接触。这个课题方向其实作为硕士毕业课题还是够用的,相对来说也是比较容易毕业的,因为涉及的分支比较多。 后续对虚拟同步机的控制,我就延续我前面博客提到的方…

图像分类项目1:基于卷积神经网络的动物图像分类

1、选题背景及动机 在现代社会中,图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用,例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类,可以帮助人们更好地了解动物种类、数量和分布情况,从…

Vue 3 整合 WangEditor 富文本编辑器:从基础到高级实践

本文将详细介绍如何在 Vue 3 项目中集成 WangEditor 富文本编辑器,实现图文混排、自定义扩展等高阶功能。 一、为什么选择 WangEditor? 作为国内流行的开源富文本编辑器,WangEditor 具有以下优势: 轻量高效:压缩后仅…

Ansys Zemax | 使用衍射光学器件模拟增强现实 (AR) 系统的出瞳扩展器 (EPE):第 4 部分

附件下载 联系工作人员获取附件 在 OpticStudio 中使用 RCWA 工具为增强现实(AR)系统设置出瞳扩展器(EPE)的示例中,首先解释了k空间中光栅的规划,并详细讨论了设置每个光栅的步骤。 介绍 本文是该四篇文…

CMake学习笔记(一):工程的新建和如何将源文件生成二进制文件

cmake是我们在工作过程中比较常见的一个工具,该系列文章是自己用来学习的笔记。目前只是记录下自己学习cmake的过程中的一些重要的知识点,其是以项目需求为导向并非完整的cmake的学习路线和系统,同样也并非适合所有的人。 1.生成一个可执行文…

libcoap在Ubuntu下的编译(基于CMake)

引言 libcoap 是一个开源的轻量级 C 语言库,用于实现 CoAP(Constrained Application Protocol,受限应用协议)。CoAP 是一种专为资源受限设备设计的轻量级通信协议,适用于物联网(IoT)和嵌入式系…

Docker新手入门(持续更新中)

一、定义 快速构建、运行、管理应用的工具。 Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用。 所谓镜像,就是将应用所需的函数库、依赖、配置等应用一起打包得到的。 所谓容器,为每个镜像的应用进程创建…

蓝桥杯C组真题——巧克力

题目如下 思路 代码及解析如下 谢谢观看

SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决

介绍一下我的是ubuntu20.04.机载电脑是orinnx,通过源码烧写的系统。 首先打开终端,输入 pip install evo --upgrade --no-binary evo 安装过程中出现如下问题 缺少 onnx 库还有Pandas 版本不兼容, ONNX(Open Neural Network E…

在虚拟机上安装hadoop

在虚拟机上安装 Hadoop 是一个常见的实验环境搭建过程。以下是详细的步骤和注意事项: 前面的课程我们已经准备好了三台虚拟设备球供我们学习大数据技术,今天我们将使用其中的一台设备来运行第一个hadoop 程序。 运行第一个 hadoop程序 要运行 hadoop 程序…

Redis 常见数据类型

官方文档 RedisCommands 1)Redis 的命令有上百个,如果纯靠死记硬背比较困难,但是如果理解 Redis 的一些机制,会发现这些命令有很强的通用性。 2)Redis 不是万金油,有些数据结构和命令必须在特定场景下使用…

VBA信息获取与处理第五节:如何在单个工作表中查找某个给定值

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

永磁同步电机无速度算法--改进滑模观测器SMO(边界层法)

一、原理介绍 根据滑模观测器的定义,其切换函数是一个拥有高频切换特性的不连续项,为了进一步减小系统的抖振,将符号函数替换为Sigmoid函数,该函数为一种连续、光滑的切换函数,对抖振有良好的抑制效果,其数…

基于SpringBoot+mybatis+layui就业管理系统设计和实现

基于SpringBootmybatislayui就业管理系统设计和实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 &…

​《开源高仿Windows 12网页版:零安装体验未来操作系统界面》​​

📌 大家好,我是智界工具库,致力于分享好用实用且智能的软件以及在JAVA语言开发中遇到的问题,如果本篇文章对你有所帮助请帮我点个小赞小收藏吧,谢谢喲!😘😘😘 博主声…

docker 安装达梦数据库(离线)

docker安装达梦数据库,官网上已经下载不了docker版本的了,下面可通过百度网盘下载 通过网盘分享的文件:dm8_20240715_x86_rh6_rq_single.tar.zip 链接: https://pan.baidu.com/s/1_ejcs_bRLZpICf69mPdK2w?pwdszj9 提取码: szj9 上传到服务…

HTML第三节

一.初识CSS 1.CSS定义 A.内部样式表 B.外部样式表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…