网站首页 > java教程 正文
引言
建造者模式(Builder Pattern)用于分离复杂对象的构造和表示,尤其当对象需多步骤构造或存在多种组合方式时。它通过链式调用逐步构建对象,避免构造器参数爆炸。一句话核心:用多个简单步骤组装复杂对象。
一、适用场景(4个关键场景)
- 参数组合爆炸
当构造器参数超过4个,且部分参数可选时,避免重叠构造器(Telescoping Constructor)。
反例:
new User(String name, int age, String address, String phone, String email...); // 参数过多难维护
- 对象需多步骤构造
如创建XML文档、SQL查询语句,需按步骤设置头、体、尾。 - 不同构造结果需独立
同一构建过程需生成不同表现形式的对象(如JSON vs XML)。 - 对象不可变(Immutable)
需一次性构建完整对象,避免setter破坏不可变性。
二、代码案例:构建不可变用户对象
需求:构建User对象,包含必选属性(id, name)和可选属性(age, phone, address)。
public class User {
// 必选属性(final修饰)
private final int id;
private final String name;
// 可选属性
private final int age;
private final String phone;
private final String address;
// 私有构造器,只允许Builder构建
private User(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.age = builder.age;
this.phone = builder.phone;
this.address = builder.address;
}
// 建造者内部类
public static class Builder {
// 必选参数(final修饰,强制初始化)
private final int id;
private final String name;
// 可选参数(提供默认值)
private int age = 0;
private String phone = "";
private String address = "";
// 必选参数通过构造器传入
public Builder(int id, String name) {
this.id = id;
this.name = name;
}
// 链式设置可选参数
public Builder age(int age) {
this.age = age;
return this;
}
public Builder phone(String phone) {
this.phone = phone;
return this;
}
public Builder address(String address) {
this.address = address;
return this;
}
// 构建不可变对象
public User build() {
return new User(this);
}
}
}
使用建造者:
User user = new User.Builder(1, "张三")
.age(25)
.phone("13800138000")
.address("北京")
.build(); // 一次性构建不可变对象
优势:
- 链式调用清晰直观
- 避免遗漏必选参数(通过Builder构造器强制校验)
- 保持User对象不可变(线程安全)
三、建造者模式优缺点
优点 | 缺点 |
参数灵活:可选参数自由组合 | 代码量增加:需额外写Builder类 |
构造过程可控:可添加校验逻辑 | 适用场景有限:简单对象不适用 |
对象不可变:提升线程安全性 | |
避免参数顺序错误:通过方法名设置 |
四、对比其他创建型模式
- vs 工厂模式
工厂模式:直接返回完整对象(适用于简单对象)
建造者:分步构建复杂对象(适用于多参数、多步骤) - vs 重叠构造器
// 传统方式:难维护
new User(1, "张三");
new User(1, "张三", 25);
new User(1, "张三", 25, "13800138000");
建造者模式彻底解决参数组合爆炸问题。
五、实际应用案例
- Lombok的@Builder注解
自动生成Builder代码:
@Builder
public class User {
private int id;
private String name;
private int age;
}
- 使用:User.builder().id(1).name("张三").build();
- Java核心库案例
StringBuilder:分步构建字符串。
Stream:通过filter(), map()等操作逐步构建数据流。
总结
- 用建造者模式当:参数 > 4个、存在可选参数、需构造不可变对象。
- 不用当:参数极少(直接构造器更简单)。
- 核心价值:分离构造逻辑与对象本身,提升可读性、灵活性和健壮性。
行动建议:
在下次遇到超4个参数的构造器时,立即改用建造者模式!
猜你喜欢
- 2025-08-05 深入理解 Spring 设计模式:从实现原理到思想精髓
- 2025-08-05 工作中最常用的 8 种设计模式
- 2025-08-05 一文读懂设计模式,看这篇就够了
- 2025-08-05 java设计模式之责任链模式
- 2025-08-05 从复杂到优雅:用建造者和责任链重塑代码架构
- 2025-08-05 带你读Effective系列:创建对象-Builder构建器
- 2025-08-05 面试官:JDK中都用了哪些设计模式?
- 2025-08-05 工厂、建造者、装饰器、适配器:解密JDK设计模式的实战妙用
- 2025-08-05 一天一个设计模式(五):建造者模式,构建优美的Java对象
- 2025-08-05 设计模式——浅谈模板方法模式与建造者模式的异同
你 发表评论:
欢迎- 08-05深入理解 Spring 设计模式:从实现原理到思想精髓
- 08-05工作中最常用的 8 种设计模式
- 08-05一文读懂设计模式,看这篇就够了
- 08-05java设计模式之责任链模式
- 08-05从复杂到优雅:用建造者和责任链重塑代码架构
- 08-05带你读Effective系列:创建对象-Builder构建器
- 08-05面试官:JDK中都用了哪些设计模式?
- 08-05工厂、建造者、装饰器、适配器:解密JDK设计模式的实战妙用
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)