以下是Java建造者模式的详细解析,结合核心概念、实现方式及应用场景:
🧱 一、模式定义
建造者模式(Builder Pattern)是一种创建型设计模式,将复杂对象的构建过程与其表示分离,使相同的构建过程可创建不同表示的对象。适用于需分步构造、含多个部件的对象(如配置类、复合实体)。
🔧 二、核心角色
角色 | 职责 | 示例 |
---|---|---|
Product | 最终构建的复杂对象,包含多个部件 | Computer 、Phone |
Builder | 抽象建造者,定义构建部件的接口 | ComputerBuilder |
ConcreteBuilder | 具体建造者,实现部件构建方法,并返回最终产品 | GamingComputerBuilder |
Director | 指挥者(可选),控制构建流程与顺序 | ComputerDirector |
⚙️ 三、实现方式
1. 经典四角色实现
// 1. 产品类
public class Computer {
private String CPU;
private String RAM;
private String storage;
// Setter 省略
}
// 2. 抽象建造者
public interface ComputerBuilder {
void buildCPU();
void buildRAM();
void buildStorage();
Computer getResult();
}
// 3. 具体建造者
public class GamingComputerBuilder implements ComputerBuilder {
private Computer computer = new Computer();
@Override
public void buildCPU() { computer.setCPU("Intel i9"); }
@Override
public void buildRAM() { computer.setRAM("32GB DDR5"); }
@Override
public Computer getResult() { return computer; }
}
// 4. 指挥者
public class Director {
public Computer construct(ComputerBuilder builder) {
builder.buildCPU();
builder.buildRAM();
builder.buildStorage();
return builder.getResult();
}
}
调用示例:
ComputerBuilder builder = new GamingComputerBuilder(); Computer gamingPC = new Director().construct(builder);
✅ 适用场景:构建流程固定且需严格顺序控制(如汽车装配线)。
2. 链式调用(静态内部类)
省略指挥者,通过Builder
内部类实现流式调用:
public class Computer { private final String CPU; private final String RAM; private Computer(Builder builder) { this.CPU = builder.CPU; this.RAM = builder.RAM; } public static class Builder { private String CPU; private String RAM; public Builder setCPU(String CPU) { this.CPU = CPU; return this; // 链式调用关键 } public Builder setRAM(String RAM) { this.RAM = RAM; return this; } public Computer build() { return new Computer(this); } } }
调用示例:
Computer pc = new Computer.Builder() .setCPU("AMD Ryzen") .setRAM("16GB") .build();
✅ 优势:代码简洁、避免构造参数过长(解决“伸缩构造函数”问题)。
🌰 应用案例:Lombok的@Builder
注解、StringBuilder
。
⚖️ 四、模式对比
模式 | 核心区别 |
---|---|
工厂模式 | 创建单一类型对象,不关注构建过程 |
建造者模式 | 分步构建复杂对象,控制细节与顺序 |
抽象工厂模式 | 创建产品家族,一次性返回多个相关对象 |
关键区别:建造者模式强调分步骤构建,而工厂模式侧重直接生成成品。
✔️ 五、适用场景
- 参数复杂的对象
避免构造方法参数过多(如含10+属性的配置类)。 - 构建过程需定制化
不同构建顺序产生不同结果(如游戏角色装备组装)。 - 隔离构建与表示
同一构建流程生成不同产品(如台式机/笔记本的装配线)。
⚠️ 六、注意事项
- 避免过度设计:简单对象直接用构造函数或Set方法。
- Director非必需:若构建流程简单,可省略指挥者(如链式调用)。
- 线程安全:若Builder被多线程共享,需做同步处理。
🌐 七、典型应用
- JDK:
StringBuilder.append()
、Locale.Builder
。 - Spring:
BeanDefinitionBuilder
构建Bean定义。 - 框架工具:Lombok
@Builder
、GuavaImmutableMap.builder()
。
建造者模式通过解耦构建过程与产品表示,显著提升代码可读性与扩展性,是处理复杂对象构造的利器。