Java 建造者模式
建造者模式是创建型设计模式之一 ,核心作用:把复杂对象的创建过程和对象本身分离,让同一个构建过程可以创建不同的对象,代码更优雅、易维护,避免多参数构造器的混乱。
简单说:当一个类有很多属性 (比如 5 个以上)、可选参数多,方便。
一、为什么要用建造者模式
假设有一个 Computer 类,属性:CPU、内存、硬盘、显卡、屏幕、键盘......如果用传统方式:
- 重叠构造器:写一堆构造方法,参数多到看不懂,极易传错顺序。
- setter 方式 :对象创建后才能赋值,无法保证对象不可变,代码零散。
java
// 参数多、导致易出错
Computer computer = new Computer("i9", "32G", "1TB", true, true, false);
二、建造者模式标准结构
核心角色
- Product(产品):要创建的复杂对象(如 Computer)
- Builder(抽象建造者):定义创建产品各部件的接口
- ConcreteBuilder(具体建造者):实现接口,完成部件创建和组装
- Director(指挥者):调用建造者,控制构建流程(可选,简化版可省略)
三、Java 实战代码
Java 中推荐 :静态内部类 Builder 写法
1. 完整代码
java
// 1. Product:最终要创建的复杂对象
public class Computer {
// 必选属性
private final String cpu;
private final String memory;
// 可选属性
private String disk;
private String gpu;
private boolean hasScreen;
// 2. 私有构造器:外部无法直接new,只能通过Builder创建
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.memory = builder.memory;
this.disk = builder.disk;
this.gpu = builder.gpu;
this.hasScreen = builder.hasScreen;
}
// 3. 静态内部类 Builder(核心)
public static class Builder {
// 必选属性(用final修饰,强制必须传)
private final String cpu;
private final String memory;
// 可选属性(赋默认值)
private String disk = "512G";
private String gpu = "集成显卡";
private boolean hasScreen = true;
// 必选参数构造器
public Builder(String cpu, String memory) {
this.cpu = cpu;
this.memory = memory;
}
// 链式调用方法:设置可选属性
public Builder disk(String disk) {
this.disk = disk;
return this; // 返回Builder自身,支持链式调用
}
public Builder gpu(String gpu) {
this.gpu = gpu;
return this;
}
public Builder hasScreen(boolean hasScreen) {
this.hasScreen = hasScreen;
return this;
}
// 4. 构建方法:返回最终的Product对象
public Computer build() {
return new Computer(this);
}
}
}
2. 使用方式(链式调用)
java
public class Test {
public static void main(String[] args) {
// 链式创建对象
Computer computer = new Computer.Builder("i9-14900K", "32G")
.disk("2TB SSD")
.gpu("RTX 4090")
.hasScreen(true)
.build();
System.out.println(computer);
}
}
四、核心优点
- 代码可读性极高 :
disk("2TB")一眼就知道是设置硬盘,不会传错参数 - 支持链式调用:一行代码完成创建,简洁美观
- 保证对象不可变 :用
final修饰属性,对象创建后无法修改 - 解耦创建与使用:复杂的组装逻辑藏在 Builder 里,调用方无需关心
- 灵活扩展:新增属性只需要修改 Builder,不影响原有代码
五、适用场景
- 类的属性非常多(≥3 个),参数复杂
- 存在大量可选参数,不想写一堆构造器
- 需要创建不可变对象(属性不允许修改)
- 相同的构建步骤,需要创建不同表现的对象
实际项目中:MyBatis-Plus 的查询条件、Lombok 的
@Builder注解、Spring 中的多种对象构建,都是建造者模式!
六、Lombok 简化建造者
实际开发中,不用手写静态内部类,用 Lombok 的 @Builder 注解 一行搞定:
java
import lombok.Builder;
import lombok.ToString;
@Builder // 自动生成建造者模式代码
@ToString // 自动生成toString
public class Computer {
private String cpu;
private String memory;
private String disk;
private String gpu;
}
使用方式完全一样:
java
Computer computer = Computer.builder()
.cpu("i9")
.memory("32G")
.disk("1TB")
.build();
总结
- 建造者模式 = 分离复杂对象的创建 + 组装
- Java 最佳实践:静态内部类 Builder + 链式调用
- 核心优势:可读性高、代码优雅、对象不可变
- 适用场景:多参数、多可选属性的复杂对象
- 开发神器:Lombok
@Builder自动生成,无需手写模板代码