java中建造者模式推荐用静态内部builder类:产品类字段全final、私有构造器;builder含必填参数构造器、可选参数链式setter、build()校验并实例化。

在 Java 中使用建造者模式,核心是把对象的创建过程从构造器中剥离出来,用链式调用分步配置,最终生成不可变(或可控)的对象。它不是“类与对象怎么用”,而是“如何设计类、组织对象创建逻辑,让使用者更安全、清晰地构造复杂对象”。
下面直接说清楚怎么落地:
用静态内部 Builder 类(最常用、推荐)
这是 Java 项目中最主流的做法,简洁、内聚、支持不可变性。
-
产品类(Product):字段全
final,私有构造器,只通过 Builder 创建 -
Builder 类:定义必填参数(构造时传入)、可选参数(链式 setter)、
build()方法完成校验和实例化
例如,构建一个 User 对象:
public class User {
private final String name;
private final int age;
private final String email;
private final String phone;
// 私有构造器,强制走 Builder
private User(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.email = builder.email;
this.phone = builder.phone;
}
// 静态内部 Builder 类
public static class Builder {
// 必填项(构造时传入)
private final String name;
private final int age;
// 可选项(链式设置)
private String email = "";
private String phone = "";
public Builder(String name, int age) {
this.name = name;
this.age = age;
}
public Builder email(String email) {
this.email = email;
return this; // 支持链式调用
}
public Builder phone(String phone) {
this.phone = phone;
return this;
}
public User build() {
// 构建前可加校验
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("name is required");
}
return new User(this);
}
}
}
使用方式非常直观:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
User user = new User.Builder("张三", 28)
.email("zhang@example.com")
.phone("13800138000")
.build();
什么时候该用?看这几个信号
- 类有 4 个以上构造参数,尤其含多个可选参数
- 部分字段必须非空,部分可为空,但又不想写一堆重载构造器
- 对象创建后不希望被修改(即需要
final字段 + 无 setter) - 创建逻辑可能扩展(比如未来要加日志、校验、默认值填充等)
不一定非要套“经典五角色”
很多资料讲 Director、ConcreteBuilder、Builder 接口 等,那适用于需要多种构建流程或多种产品类型的场景(如:同一套组装流程,生产游戏本/办公本/轻薄本)。但日常业务开发中,90% 的情况只需一个静态 Builder 内部类就够了——它已涵盖核心价值:解耦创建逻辑、提升可读性、保障对象完整性。
小提醒:Lombok 可自动帮你写
如果你用 Lombok,加个 @Builder 注解就能自动生成 Builder 结构:
@Builder
public class User {
private final String name;
private final int age;
private final String email;
private final String phone;
}
编译后效果等同手写,但要注意:
-
@Builder默认不校验必填字段(需配合@NonNull或手动build()里校验) - 若字段是
final,Lombok 会自动用私有构造器 + Builder,符合不可变设计
这样写出来的类,既清晰表达了“谁是必需的、谁是可选的”,又避免了参数错位、遗漏或误传,也方便后期维护和扩展。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










