3.设计模式-BUILDER(生成器)

一、模式定义与核心价值

建造者模式是一种创建型设计模式,其核心目标是将复杂对象的构建过程最终表示分离,使得同一构建流程可以生成不同表现形式的对象

核心价值

  1. 构建解耦:将对象的多参数初始化过程封装,避免构造器参数爆炸
  2. 流程可控:通过分步构建确保对象创建过程的正确性与完整性
  3. 扩展灵活:新增对象表现形式时无需修改既有构建逻辑

工业级场景

  • 需要创建包含多个组件的复杂对象(如汽车、电脑配置)
  • 存在可选参数参数依赖顺序的初始化场景
  • 需要实现链式调用提升代码可读性

二、模式组成与UML类图

核心角色

  1. Product(产品):最终构建的复杂对象
  2. Builder(抽象建造者):定义构建步骤的接口
  3. ConcreteBuilder(具体建造者):实现具体构建逻辑
  4. Director(指导者):控制构建流程(可选角色)

UML类图

classDiagram
    class Director {
        +construct(builder: Builder)
    }

    class Builder {
        <<interface>>
        +buildPartA()
        +buildPartB()
        +getResult() Product
    }

    class ConcreteBuilder {
        -product: Product
        +buildPartA()
        +buildPartB()
        +getResult() Product
    }

    class Product {
        +setPartA()
        +setPartB()
    }

    Director --> Builder
    Builder <|.. ConcreteBuilder
    ConcreteBuilder --> Product

image

角色协作流程

  1. 客户端创建Director并配置具体Builder
  2. Director调用Builder接口方法完成分步构建
  3. 最终通过getResult()获取完整产品对象

三、代码实现示例

场景:构建一台包含CPU、内存、硬盘的计算机

  1. 定义产品类
class Computer {
    private String cpu;
    private String ram;
    private String storage;

    public void setCpu(String cpu) { this.cpu = cpu; }
    public void setRam(String ram) { this.ram = ram; }
    public void setStorage(String storage) { this.storage = storage; }

    public String getSpec() {
        return String.format("CPU: %s | RAM: %s | Storage: %s", cpu, ram, storage);
    }
}
  1. 抽象建造者接口
interface ComputerBuilder {
    void buildCPU();
    void buildRAM();
    void buildStorage();
    Computer getResult();
}
  1. 具体建造者实现
class GamingComputerBuilder implements ComputerBuilder {
    private Computer computer = new Computer();

    public void buildCPU() { computer.setCpu("Intel i9-13900K"); }
    public void buildRAM() { computer.setRam("DDR5 64GB"); }
    public void buildStorage() { computer.setStorage("2TB NVMe SSD"); }
    public Computer getResult() { return computer; }
}

class OfficeComputerBuilder implements ComputerBuilder { /* 类似实现 */ }
  1. 指导者类(可选)
class ComputerDirector {
    public Computer construct(ComputerBuilder builder) {
        builder.buildCPU();
        builder.buildRAM();
        builder.buildStorage();
        return builder.getResult();
    }
}
  1. 客户端调用
public class Client {
    public static void main(String[] args) {
        ComputerDirector director = new ComputerDirector();

        // 构建游戏电脑
        Computer gamingPC = director.construct(new GamingComputerBuilder());
        System.out.println(gamingPC.getSpec());

        // 直接使用建造者(无指导者场景)
        ComputerBuilder officeBuilder = new OfficeComputerBuilder();
        officeBuilder.buildCPU();
        officeBuilder.buildRAM();
        Computer officePC = officeBuilder.getResult();
    }
}

四、工业级源码应用

  1. Java标准库
  • **StringBuilder**:通过append()方法链式构建字符串6
StringBuilder sb = new StringBuilder()
.append("Hello")
.append(" ")
.append("World");
  1. Android开发
  • **AlertDialog.Builder**:分步构建对话框组件12
new AlertDialog.Builder(context)
.setTitle("提示")
.setMessage("确认删除?")
.setPositiveButton("确定", listener)
.create()
.show();
  1. 网络框架
  • OkHttpClient:通过内部Builder类配置网络参数6
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
  1. Lombok注解
  • **@Builder**:自动生成建造者模式代码5
@Builder
public class User {
    private Long id;
    private String name;
    private String email;
}
// 使用方式
User user = User.builder().id(1L).name("Mike").build();

五、模式优缺点与适用场景

优势

  • 参数灵活:支持可选参数与构建顺序调整11
  • 代码可读:链式调用提升代码表达力3
  • 对象完整:通过build()方法保证最终对象有效性

局限性

  • 类数量膨胀:每个产品需要对应建造者类9
  • 性能损耗:中间对象创建增加GC压力11

适用场景

  1. 需要创建包含多个组成部分的复杂对象
  2. 对象属性存在相互依赖构建顺序要求
  3. 需要屏蔽复杂对象的创建细节

六、扩展变体与最佳实践

  1. 简化变体
  • 省略Director角色,由客户端直接控制构建流程1
  • 合并BuilderProduct角色(常见于链式调用实现)
  1. 线程安全实践
  • Builder类进行同步控制
  • 使用不可变对象确保构建结果安全
  1. 校验增强
  • build()方法中加入参数校验逻辑
public Computer build() {
    if (cpu == null) throw new IllegalStateException("CPU未配置");
    return new Computer(this);
}

总结

建造者模式通过分步构建结果解耦的设计哲学,为复杂对象的创建提供了优雅的解决方案。在Java生态中,该模式已深度融入主流框架与工具链,成为应对复杂初始化场景的利器。理解其核心思想并掌握灵活变通的使用方式,将显著提升代码的可维护性与扩展性。

posted @ 2025-04-12 10:36  雾里看花的少年  阅读(68)  评论(0)    收藏  举报