Java建造者模式(Builder Pattern)详解与实践
一、引言
在软件开发中,我们经常会遇到需要创建复杂对象的场景。例如,构建一个包含多个可选参数的对象时,传统的构造函数或Setter方法可能导致代码臃肿、难以维护。此时,建造者模式(Builder Pattern)便成为一种优雅的解决方案。它通过分步骤构建对象,将对象的创建过程与其表示分离,从而提高代码的可读性和可维护性。
二、什么是建造者模式?
建造者模式(Builder Pattern)是一种创建型设计模式,其核心思想是通过分步骤构造复杂对象,最终返回一个完整的产品。它允许相同的构建过程创建不同的表示,同时避免构造函数参数过多的问题。
例如:Person person1=new Person(10个参数)
如果只需要其中3个的话,就得提供一个3个参数的构造函数
1.核心角色
- Product(产品):最终构建的复杂对象。
- Builder(抽象建造者):定义构建产品的抽象步骤。
- ConcreteBuilder(具体建造者):实现Builder接口,完成具体构建逻辑。
- Director(指挥者,可选):控制构建流程,协调建造者的步骤。
2.适用场景
- 创建包含多个部件的复杂对象(如配置类、HTTP请求对象)。
- 需要控制对象的创建过程(分步骤构建)。
- 需要构建不同表示的对象(相同构建过程,不同实现)。
- 希望避免构造器参数过多(解决“伸缩构造函数”问题)。
三、代码示例:
1.电脑
⑴.产品 (Product):Computer
类表示要构建的电脑
产品提供每个字段的set方法
// 产品类:电脑
public class Computer {private String cpu;private String memory;private String hardDisk;private String graphicsCard;private String monitor;private String keyboard;private String mouse;public void setCpu(String cpu) {this.cpu = cpu;}public void setMemory(String memory) {this.memory = memory;}public void setHardDisk(String hardDisk) {this.hardDisk = hardDisk;}public void setGraphicsCard(String graphicsCard) {this.graphicsCard = graphicsCard;}public void setMonitor(String monitor) {this.monitor = monitor;}public void setKeyboard(String keyboard) {this.keyboard = keyboard;}public void setMouse(String mouse) {this.mouse = mouse;}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", hardDisk='" + hardDisk + '\'' +", graphicsCard='" + graphicsCard + '\'' +", monitor='" + monitor + '\'' +", keyboard='" + keyboard + '\'' +", mouse='" + mouse + '\'' +'}';}
}
⑵.抽象建造者 (Builder):ComputerBuilder
接口定义了构建电脑各部分的方法
接口定义二次封装的构建方法
// 抽象建造者接口
public interface ComputerBuilder {void buildCPU();void buildMemory();void buildHardDisk();void buildGraphicsCard();void buildMonitor();void buildKeyboard();void buildMouse();Computer getComputer();
}
⑶.具体建造者 (ConcreteBuilder):
GamingComputerBuilder
和OfficeComputerBuilder
实现了抽象接口
// 具体建造者:游戏电脑建造者
public class GamingComputerBuilder implements ComputerBuilder {private Computer computer = new Computer();@Overridepublic void buildCPU() {computer.setCpu("Intel i9-12900K");}@Overridepublic void buildMemory() {computer.setMemory("32GB DDR5 5200MHz");}@Overridepublic void buildHardDisk() {computer.setHardDisk("2TB NVMe SSD");}@Overridepublic void buildGraphicsCard() {computer.setGraphicsCard("NVIDIA RTX 4090");}@Overridepublic void buildMonitor() {computer.setMonitor("4K 144Hz Gaming Monitor");}@Overridepublic void buildKeyboard() {computer.setKeyboard("Mechanical Gaming Keyboard");}@Overridepublic void buildMouse() {computer.setMouse("High Precision Gaming Mouse");}@Overridepublic Computer getComputer() {return computer;}
}
// 具体建造者:办公电脑建造者
public class OfficeComputerBuilder implements ComputerBuilder {private Computer computer = new Computer();@Overridepublic void buildCPU() {computer.setCpu("Intel i5-12400");}@Overridepublic void buildMemory() {computer.setMemory("16GB DDR4 3200MHz");}@Overridepublic void buildHardDisk() {computer.setHardDisk("512GB NVMe SSD");}@Overridepublic void buildGraphicsCard() {computer.setGraphicsCard("Integrated Graphics");}@Overridepublic void buildMonitor() {computer.setMonitor("24-inch Full HD Monitor");}@Overridepublic void buildKeyboard() {computer.setKeyboard("Wireless Keyboard");}@Overridepublic void buildMouse() {computer.setMouse("Wireless Mouse");}@Overridepublic Computer getComputer() {return computer;}
}
⑷.指挥者 (Director):
ComputerDirector
控制构建过程的顺序
// 指挥者:电脑装配指导
public class ComputerDirector {private ComputerBuilder computerBuilder;public ComputerDirector(ComputerBuilder computerBuilder) {this.computerBuilder = computerBuilder;}public void setComputerBuilder(ComputerBuilder computerBuilder) {this.computerBuilder = computerBuilder;}public Computer constructComputer() {computerBuilder.buildCPU();computerBuilder.buildMemory();computerBuilder.buildHardDisk();computerBuilder.buildGraphicsCard();computerBuilder.buildMonitor();computerBuilder.buildKeyboard();computerBuilder.buildMouse();return computerBuilder.getComputer();}
}
⑸.测试
// 演示程序
public class BuilderPatternDemo {public static void main(String[] args) {// 创建具体建造者ComputerBuilder gamingBuilder = new GamingComputerBuilder();ComputerBuilder officeBuilder = new OfficeComputerBuilder();// 创建指挥者并指定建造者ComputerDirector director = new ComputerDirector(gamingBuilder);// 构建游戏电脑Computer gamingComputer = director.constructComputer();System.out.println("游戏电脑配置:");System.out.println(gamingComputer);// 切换为办公电脑建造者director.setComputerBuilder(officeBuilder);// 构建办公电脑Computer officeComputer = director.constructComputer();System.out.println("\n办公电脑配置:");System.out.println(officeComputer);}
}
2.建造一座房屋
以下是一个完整、简单且可运行的Java代码示例,演示如何通过建造者模式构建一个House
对象。
⑴. 产品类(Product)
public class House {private final String walls;private final String roof;private final String windows;// 私有构造函数,防止外部直接创建private House(Builder builder) {this.walls = builder.walls;this.roof = builder.roof;this.windows = builder.windows;}@Overridepublic String toString() {return "House{" +"walls='" + walls + '\'' +", roof='" + roof + '\'' +", windows='" + windows + '\'' +'}';}// 静态内部类:建造者public static class Builder {private String walls;private String roof;private String windows;// 设置墙壁public Builder setWalls(String walls) {this.walls = walls;return this;}// 设置屋顶public Builder setRoof(String roof) {this.roof = roof;return this;}// 设置窗户public Builder setWindows(String windows) {this.windows = windows;return this;}// 构建并返回House对象public House build() {return new House(this);}}
}
⑵.客户端调用(直接使用建造者)
public class Client {public static void main(String[] args) {// 使用建造者模式构建一座房屋House house = new House.Builder().setWalls("Brick").setRoof("Tile").setWindows("Double Glazed").build();System.out.println(house);}
}
⑶.可选:指挥者类(Director)
如果构建流程较为固定,可以通过Director类封装构建逻辑:
public class Director {// 构建标准房屋public House constructStandardHouse() {return new House.Builder().setWalls("Concrete").setRoof("Asphalt").setWindows("Single Glazed").build();}// 构建豪华房屋public House constructLuxuryHouse() {return new House.Builder().setWalls("Stone").setRoof("Wood").setWindows("Triple Glazed").build();}
}
⑷.客户端调用(通过Director)
public class ClientWithDirector {public static void main(String[] args) {Director director = new Director();House standardHouse = director.constructStandardHouse();House luxuryHouse = director.constructLuxuryHouse();System.out.println("Standard House: " + standardHouse);System.out.println("Luxury House: " + luxuryHouse);}
}
四、实际应用场景
建造者模式在Java生态中广泛应用于以下场景:
- Java内置类:
StringBuilder
的链式调用(如append()
方法)。 - 复杂对象构建:如HTTP请求对象、数据库查询构建器。
- 配置类:例如,构建一个包含多个可选参数的配置对象。
五、总结
建造者模式通过分步骤构建复杂对象,将对象的创建过程与表示分离,解决了构造函数参数过多、代码臃肿的问题。通过链式调用和可选参数的支持,它提高了代码的可读性和可维护性。在实际开发中,无论是构建一个简单的房屋对象,还是处理复杂的业务需求,建造者模式都能提供清晰的解决方案。
相关文章:

Java建造者模式(Builder Pattern)详解与实践
一、引言 在软件开发中,我们经常会遇到需要创建复杂对象的场景。例如,构建一个包含多个可选参数的对象时,传统的构造函数或Setter方法可能导致代码臃肿、难以维护。此时,建造者模式(Builder Pattern)便成为…...
ant-design4.xx实现数字输入框; 某些输入法数字需要连续输入两次才显示
目录 一、问题 二、解决方法 三、总结 一、问题 1.代码里有一个基于ant封装的公共组件数字输入框,测试突然说 无效了,输入其他字符也会显示;改了只有又发现某些 输入法 需要连续输入两次 才能显示出来。 二、解决方法 1.就离谱࿰…...
使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表.
使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表. 将原来SQLAlchemy的模型,修改依赖为: from bee.helper import SQLAlchemy 然后就可以开始生成了。很简单,主要是两个接口。 db.create_all(True) #创建所有模型的表…...
【win | 自动更新关闭】win11
利用本地组策略编辑器 对于Windows 11专业版或更高版本的用户,可以利用本地组策略编辑器来完全关闭自动更新。按下“WinR”键,输入“gpedit.msc”并回车。在本地组策略编辑器中,依次展开“计算机配置”>“管理模板”>“Windows组件”&…...

win32相关(IAT HOOK)
IAT HOOK 什么是IAT Hook? IAT Hook(Import Address Table Hook,导入地址表钩子)是一种Windows平台下的API钩取技术,通过修改目标程序的导入地址表(IAT)来拦截和重定向API调用 在我们之前学习pe文件结构的导入表时&am…...
大模型高效提示词Prompt编写指南
大模型高效Prompt编写指南 一、引言二、核心原则1. 清晰性原则:明确指令与期望2. 具体性原则:提供详细上下文3. 结构化原则:组织信息的逻辑与层次4. 迭代优化原则:通过反馈改进Prompt5. 简洁性原则:避免冗余信息 三、文…...

零基础玩转物联网-串口转以太网模块如何快速实现与TCP服务器通信
目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 驱动检查 3 TCP服务器通信配置与交互 3.1 硬件连接 3.2 开启TCP服务器 3.3 打开配置工具读取基本信息 3.4 填写连接参数进行连接 3.5 通信测试 4 总结 1 前言 TCP是TCP/IP体系中的传输层协议,全称为Transmiss…...
十一、【ESP32开发全栈指南: TCP通信服务端】
一、TCP与UDP协议对比 1.1 基本特性比较 TCP(传输控制协议)和UDP(用户数据报协议)是两种最常用的传输层协议,它们在ESP32网络编程中都有广泛应用: 连接方式 TCP是面向连接的协议,通信前需要先建立连接(三次握手)UDP是无连接的协议ÿ…...

ESP32开发之LED闪烁和呼吸的实现
硬件电路介绍GPIO输出模式GPIO配置过程闪烁灯的源码LED PWM的控制器(LEDC)概述LEDC配置过程及现象整体流程 硬件电路介绍 电路图如下: 只要有硬件基础的应该都知道上图中,当GPIO4的输出电平为高时,LED灯亮,反之则熄灭。如果每间…...

【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录、退款业务记录
【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录 前言 我为什么要写这个篇文章 总结设计经验生成设计模板方便后期快速搭建 一个几张表 一共5张表; 分别是: 订单主表:jjy_orderMain订单产…...

2025软件供应链安全最佳实践︱证券DevSecOps下供应链与开源治理实践
项目背景:近年来,云计算、AI人工智能、大数据等信息技术的不断发展、各行各业的信息电子化的步伐不断加快、信息化的水平不断提高,网络安全的风险不断累积,金融证券行业面临着越来越多的威胁挑战。特别是近年以来,开源…...
Linux安装jdk、tomcat
1、安装jdk sudo yum install -y java-1.8.0-openjdk-devel碰到的问题:/var/run/yum.pid 已被锁定 Another app is currently holding the yum lock; waiting for it to exit… https://blog.csdn.net/u013669912/article/details/131259156 参考&#…...

WebRTC通话原理与入门难度实战指南
波煮的实习公司主要是音视频业务,所以最近在补习WebRTC的相关内容,会不定期给大家分享学习心得和笔记。 文章目录 WebRTC通话原理进行媒体协商:彼此要了解对方支持的媒体格式网络协商:彼此要了解对方的网络情况,这样才…...

N元语言模型 —— 一文讲懂!!!
目录 引言 一. 基本知识 二.参数估计 三.数据平滑 一.加1法 二.减值法/折扣法 编辑 1.Good-Turing 估计 编辑 2.Back-off (后备/后退)方法 3.绝对减值法 编辑4.线性减值法 5.比较 三.删除插值法(Deleted interpolation) 四.模型自适应 引言 本章节讲的…...

.NET 9中的异常处理性能提升分析:为什么过去慢,未来快
一、为什么要关注.NET异常处理的性能 随着现代云原生、高并发、分布式场景的大量普及,异常处理(Exception Handling)早已不再只是一个冷僻的代码路径。在高复杂度的微服务、网络服务、异步编程环境下,服务依赖的外部资源往往不可…...

Mac 安装git心路历程(心累版)
省流版:直接安装Xcode命令行工具即可,不用安Xcode。 git下载官网 第一部分 上网初步了解后,打算直接安装Binary installer,下载完安装时,苹果还阻止安装,只好在“设置–安全性与隐私”最下面的提示进行安…...

计算机网络第2章(下):物理层传输介质与核心设备全面解析
目录 一、传输介质1.1 传输介质的分类1.2 导向型传输介质1.2.1 双绞线(Twisted Pair)1.2.2 同轴电缆(Coaxial Cable)1.2.3 光纤(Optical Fiber)1.2.4 以太网对有线传输介质的命名规则 1.3 非导向型传输介质…...
Qt Creator 11.0创建ROS2 Humble工程
Qt Creator 11.0创建ROS2 Humble项目工程 安装ROSProjectManager插件创建ROS2项目在src下添加packagegit clone ROS2功能包编译运行安装ROSProjectManager插件 安装ROSProjectManager的主要流程参考官方的流程,地址(ros_qtc_plugin)。 此处采用二进制安装: sudo apt inst…...

C# 类和继承(扩展方法)
扩展方法 在迄今为止的内容中,你看到的每个方法都和声明它的类关联。扩展方法特性扩展了这个边 界,允许编写的方法和声明它的类之外的类关联。 想知道如何使用这个特性,请看下面的代码。它包含类MyData,该类存储3个double类型 的…...
机器学习复习3--模型的选择
选择合适的机器学习模型是机器学习项目成功的关键一步。这通常不是一个一蹴而就的过程,而是需要综合考虑多个因素,并进行实验和评估。 1. 理解问题本质 这是模型选择的首要步骤。需要清晰地定义试图解决的问题类型: 监督学习 : 数据集包含…...

MySQL复杂SQL(多表联查/子查询)详细讲解
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 MySQL复杂SQL(多表联查/子查询&a…...

STM32使用土壤湿度传感器
1.1 介绍: 土壤湿度传感器是一种传感装置,主要用于检测土壤湿度的大小,并广泛应用于汽车自动刮水系统、智能灯光系统和智能天窗系统等。传感器采用优质FR-04双料,大面积5.0 * 4.0厘米,镀镍处理面。 它具有抗氧化&…...
在C++中,头文件(.h或.hpp)的标准写法
目录 1.头文件保护(Include Guards)2.包含必要的标准库头文件3.前向声明(Forward Declarations)4.命名空间5.注释示例1:基础头文件示例2:包含模板和内联函数的头文件示例3:C11风格的枚举类头文件…...
Axios学习笔记
Axios简介 axios前端异步请求库类似JQuery ajax技术, ajax用来在页面发起异步请求到后端服务,并将后端服务响应数据渲染到页面上, jquery推荐ajax技术,但vue里面并不推荐在使用jquery框架,vue推荐使用axios异步请求库。…...
Langchain学习笔记(十一):Chain构建与组合技巧
注:本文是Langchain框架的学习笔记;不是教程!不是教程!内容可能有所疏漏,欢迎交流指正。后续将持续更新学习笔记,分享我的学习心得和实践经验。 前言 在LangChain的发展过程中,API设计经历了重…...
【判断既约分数】2022-4-3
缘由既约分数,除了辗转相除法-编程语言-CSDN问答 void 判断既约分数() {int a 1, b 2020, aa b, y 2, gs 0;while (aa){while (a < b){while (y < a && y < aa)if (a%y 0 && aa%y 0)a, y 2;elsey;if (a < b)gs; else;a, y 2;…...

Windows平台RTSP/RTMP播放器C#接入详解
大牛直播SDK在Windows平台下的RTSP、RTMP播放器模块,基于自研高性能内核,具备极高的稳定性与行业领先的超低延迟表现。相比传统基于FFmpeg或VLC的播放器实现,SmartPlayer不仅支持RTSP TCP/UDP自动切换、401鉴权、断网重连等网络复杂场景自适应…...
深圳SMT贴片工艺优化关键步骤
内容概要 深圳SMT贴片工艺优化作为现代电子制造的核心环节,聚焦于提升生产精度与稳定性。其技术框架围绕三大核心维度展开:温度动态调控、设备协同适配与工艺缺陷预判。通过精密温度曲线控制系统,实现回流焊环节的热能梯度精准匹配ÿ…...

从 JDK 8 到 JDK 17:Swagger 升级迁移指南
点击上方“程序猿技术大咖”,关注并选择“设为星标” 回复“加群”获取入群讨论资格! 随着 Java 生态向 JDK 17 及 Jakarta EE 的演进,许多项目面临从 JDK 8 升级的挑战,其中 Swagger(API 文档工具)的兼容性…...
配置git命令缩写
以下是 Git 命令缩写的配置方法及常用方案,适用于 Linux/macOS/Windows 系统: 🔧 一、配置方法 1. 命令行设置(推荐) # 基础命令缩写 git config --global alias.st status git config --global alias.co che…...