建造者模式(Builder Pattern)学习笔记
1. 模式定义
建造者模式是一种创建型设计模式,通过分步构建复杂对象的方式,将对象的构建过程与表示分离。允许使用相同的构建过程创建不同的对象表示。
2. 适用场景
✅ 需要创建包含多个部件的复杂对象
✅ 需要控制对象的创建过程(分步骤构建)
✅ 需要构建不同表示的对象(相同构建过程不同实现)
✅ 希望避免构造器参数过多(解决"伸缩构造函数"问题)
3. 模式结构
4. 核心角色
角色 | 说明 |
---|---|
Director | 指挥者,控制构建过程(非必须) |
Builder | 抽象建造者,定义构建步骤的接口 |
ConcreteBuilder | 具体建造者,实现构建步骤并返回产品 |
Product | 最终构建的复杂对象 |
5. 代码示例
5.1 产品类
public class Computer {
private String cpu;
private String ram;
private String storage;
// 构造函数、getters、toString...
}
5.2 抽象建造者
public interface ComputerBuilder {
void buildCPU();
void buildRAM();
void buildStorage();
Computer getResult();
}
5.3 具体建造者
public class GamingComputerBuilder implements ComputerBuilder {
private Computer computer = new Computer();
@Override
public void buildCPU() {
computer.setCpu("Intel i9-13900K");
}
@Override
public void buildRAM() {
computer.setRam("64GB DDR5");
}
@Override
public void buildStorage() {
computer.setStorage("2TB NVMe SSD");
}
@Override
public Computer getResult() {
return computer;
}
}
5.4 指挥者(可选)
public class Director {
private ComputerBuilder builder;
public Director(ComputerBuilder builder) {
this.builder = builder;
}
public Computer construct() {
builder.buildCPU();
builder.buildRAM();
builder.buildStorage();
return builder.getResult();
}
}
5.5 客户端调用
public class Client {
public static void main(String[] args) {
ComputerBuilder builder = new GamingComputerBuilder();
Director director = new Director(builder);
Computer computer = director.construct();
// 或直接使用建造者
ComputerBuilder builder2 = new OfficeComputerBuilder();
builder2.buildCPU();
builder2.buildRAM();
Computer simpleComputer = builder2.getResult();
}
}
6. 模式变种
- 链式调用版:
public class Computer {
// 使用静态内部类实现
public static class Builder {
private String cpu;
private String ram;
public Builder withCPU(String cpu) {
this.cpu = cpu;
return this;
}
public Builder withRAM(String ram) {
this.ram = ram;
return this;
}
public Computer build() {
return new Computer(this);
}
}
}
// 使用:new Computer.Builder().withCPU("i7").withRAM("16GB").build();
7. 优缺点分析
✔️ 优点:
- 分离构建过程和表示
- 更好的控制构建过程
- 方便扩展新的产品类型
- 避免过多构造函数参数
❌ 缺点:
- 增加代码复杂度
- 产品需要高度相似才适用
- 对简单对象的创建可能显得冗余
8. 相关模式对比
模式 | 关注点 | 复杂度 | 使用场景 |
---|---|---|---|
工厂模式 | 对象整体创建 | 低 | 创建单一类型对象 |
抽象工厂模式 | 产品族的创建 | 高 | 创建相关对象家族 |
建造者模式 | 分步构建复杂对象 | 中 | 需要分步骤构建的复杂对象 |
9. 实际应用案例
- Java中的StringBuilder
- Spring中的BeanDefinitionBuilder
- Lombok的@Builder注解实现
- Android中的AlertDialog.Builder
10. 最佳实践建议
- 当构造器参数超过4个时考虑使用
- 需要创建不可变对象时优先使用
- 使用链式调用增强可读性
- 当构建顺序重要时一定要保留Director角色
📌 记忆技巧:把建造者模式想象成"分步填表"的过程,最后提交表格生成完整对象。