Java设计模式之建造者模式详解
一、建造者模式核心思想
核心目标:分离复杂对象的构建过程与表示,通过分步骤构造对象的方式,支持灵活配置不同参数组合,解决构造函数参数爆炸问题。
二、建造者模式类图(Mermaid)
三、模式核心角色
角色 | 职责描述 |
---|---|
Director | 指挥构建过程(可选角色) |
Builder | 定义构建步骤的抽象接口 |
ConcreteBuilder | 实现具体构建逻辑 |
Product | 最终构建的复杂对象 |
四、代码实现示例
1. 基础实现版本
// 产品类
class Computer {
private String cpu;
private int ram;
public void setCpu(String cpu) { this.cpu = cpu; }
public void setRam(int ram) { this.ram = ram; }
public void showSpecs() {
System.out.println("CPU: " + cpu + ", RAM: " + ram + "GB");
}
}
// 抽象建造者
interface ComputerBuilder {
void buildCpu();
void buildRam();
Computer getResult();
}
// 具体建造者
class GamingComputerBuilder implements ComputerBuilder {
private Computer computer = new Computer();
public void buildCpu() { computer.setCpu("Intel i9"); }
public void buildRam() { computer.setRam(32); }
public Computer getResult() { return computer; }
}
// 指挥者(可选)
class Director {
public Computer construct(ComputerBuilder builder) {
builder.buildCpu();
builder.buildRam();
return builder.getResult();
}
}
// 客户端调用
ComputerBuilder builder = new GamingComputerBuilder();
Director director = new Director();
Computer computer = director.construct(builder);
computer.showSpecs(); // 输出: CPU: Intel i9, RAM: 32GB
2. 链式调用优化版(常用实践)
class Computer {
private String cpu;
private int ram;
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.ram = builder.ram;
}
public static class Builder {
private String cpu = "Intel i5"; // 默认值
private int ram = 8;
public Builder cpu(String cpu) {
this.cpu = cpu;
return this;
}
public Builder ram(int ram) {
this.ram = ram;
return this;
}
public Computer build() {
return new Computer(this);
}
}
}
// 客户端调用
Computer computer = new Computer.Builder()
.cpu("AMD Ryzen 9")
.ram(64)
.build();
五、模式优缺点分析
✅ 优势
- 参数灵活组合:避免构造方法参数爆炸(如20个参数的构造函数)
- 构建过程可控:支持分步骤、按需构建对象
- 代码可读性高:链式调用更符合自然语言习惯
- 产品与构建解耦:相同构建过程可创建不同表示
❌ 缺点
- 代码复杂度增加:需额外创建Builder类
- 性能损耗:对象需经过多步构建过程
六、典型应用场景
- 复杂配置对象:如数据库连接配置(含超时时间、连接池大小等参数)
- 文档生成器:HTML/PDF文档的Header/Body/Footer分步构建
- 套餐组合:快餐店套餐(汉堡+饮料+配餐的自由组合)
- 游戏角色创建:逐步选择职业、装备、技能等属性
七、Mermaid序列图示例
八、常见问题解答
Q1:建造者模式 vs 工厂模式?
对比维度 | 建造者模式 | 工厂模式 |
---|---|---|
关注点 | 分步骤构建复杂对象 | 直接创建完整对象 |
使用场景 | 对象包含多个组件需要组合 | 对象创建逻辑简单 |
灵活性 | 支持灵活配置不同参数组合 | 固定类型的产品创建 |
Q2:何时需要Director角色?
- 当构建流程需要标准化时使用(如必须按A→B→C顺序构建)
- 简单场景可直接通过客户端控制构建步骤
Q3:如何实现参数校验?
在build()
方法中添加校验逻辑:
public Computer build() {
if (cpu == null) {
throw new IllegalArgumentException("CPU不能为空");
}
return new Computer(this);
}
九、Lombok简化实现
使用@Builder
注解自动生成建造者:
import lombok.Builder;
import lombok.ToString;
@Builder
@ToString
class Laptop {
private String model;
private int ssdSize;
private boolean hasTouchScreen;
}
// 客户端调用
Laptop laptop = Laptop.builder()
.model("X1 Carbon")
.ssdSize(512)
.hasTouchScreen(true)
.build();
掌握建造者模式,可以优雅地解决复杂对象创建难题,让代码在扩展性和可读性之间达到完美平衡!
如果觉得文章对你有帮助,请帮忙点个关注吧,谢谢啦!