聊一聊:设计模式——建造者模式

你好,我是风一样的树懒,一个工作十多年的后端专家,曾就职京东、阿里等多家互联网头部企业。公众号“吴计可师”,已经更新了近百篇高质量的面试相关文章,喜欢的朋友欢迎关注点赞

建造者模式详解

一、定义与核心思想
建造者模式(Builder Pattern)是一种创建型设计模式,将复杂对象的构造过程与其表示分离,使得同样的构建过程可创建不同的对象形式。其核心在于分步构建灵活组合,尤其适用于具有多个可选参数或复杂配置流程的对象。


二、适用场景

  1. 参数众多的构造函数:避免构造方法参数爆炸(Telescoping Constructor)。
  2. 多步骤构造过程:需按特定顺序或条件设置对象属性。
  3. 创建不可变对象:通过Builder生成最终不可变实例。
  4. 多种对象变体:同一构建流程可生成不同表现形式的对象(如豪华版/基础版配置)。

三、模式结构

角色职责
产品(Product)待构建的复杂对象(如计算机、报告文档)。
抽象建造者(Builder)定义构建步骤的接口(如设置CPU、内存等)。
具体建造者(Concrete Builder)实现构建接口,提供不同实现(如游戏电脑/办公电脑建造器)。
指挥者(Director)控制构建流程(可选),封装构造逻辑。
客户端(Client)通过指挥者或直接使用建造者创建对象。

四、实现示例:构建高性能计算机

// 产品类(不可变)
public class Computer {
    private final String cpu;
    private final String gpu;
    private final int ram;
    private final int storage;

    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.gpu = builder.gpu;
        this.ram = builder.ram;
        this.storage = builder.storage;
    }

    // 静态内部建造者
    public static class Builder {
        private String cpu;  // 必选参数
        private String gpu = "集成显卡";  // 可选默认值
        private int ram = 8;          // 可选默认值
        private int storage = 256;    // 可选默认值

        public Builder(String cpu) {
            this.cpu = cpu;
        }

        public Builder gpu(String gpu) {
            this.gpu = gpu;
            return this;
        }

        public Builder ram(int ram) {
            this.ram = ram;
            return this;
        }

        public Builder storage(int storage) {
            this.storage = storage;
            return this;
        }

        public Computer build() {
            validate();  // 参数校验
            return new Computer(this);
        }

        private void validate() {
            if (ram < 4) throw new IllegalArgumentException("内存至少4GB");
        }
    }
}

// 客户端使用
Computer gamingPC = new Computer.Builder("Intel i9")
    .gpu("RTX 4090")
    .ram(32)
    .storage(1024)
    .build();

五、核心优势

  1. 参数灵活:可选参数自由组合,避免构造方法重载。
  2. 代码可读性:链式调用清晰表达构建逻辑(如.cpu().ram().build())。
  3. 不可变性保证:产品类属性可设为final,线程安全。
  4. 构建过程控制:通过Director统一管理复杂构建流程(如汽车组装步骤)。

六、变体与进阶技巧

  1. Lombok简化:使用@Builder注解自动生成建造者类。

    @Builder
    public class User {
        private String name;
        private int age;
    }
    // 使用:User.builder().name("Alice").age(30).build();
    
  2. 级联建造者:处理嵌套对象构建。

    public class Car {
        private Engine engine;
        private Wheel wheel;
        
        public static class Builder {
            private Engine.Builder engineBuilder = new Engine.Builder();
            private Wheel.Builder wheelBuilder = new Wheel.Builder();
            
            public Builder engine(String type) {
                engineBuilder.type(type);
                return this;
            }
            
            public Car build() {
                return new Car(engineBuilder.build(), wheelBuilder.build());
            }
        }
    }
    
  3. Director增强:封装典型配置方案。

    public class ComputerDirector {
        public Computer buildGamingComputer() {
            return new Computer.Builder("AMD Ryzen 9")
                .gpu("RTX 4080")
                .ram(64)
                .storage(2048)
                .build();
        }
    }
    

七、与工厂模式对比

维度建造者模式工厂模式
关注点分步构建复杂对象直接创建完整对象
参数处理支持多参数灵活组合通常参数较少且固定
适用场景对象构造流程复杂,需精细控制快速生成标准对象
代码复杂度较高(需定义Builder类)较低(集中式创建)

八、应用案例

  1. Java标准库StringBuilderLocalDate.build()
  2. JSON解析库:Gson/Jackson通过Builder配置序列化规则。
  3. GUI框架:Android AlertDialog.Builder构建对话框。
  4. HTTP客户端:OkHttpClient.Builder配置超时、拦截器。

九、注意事项

  1. 过度设计:简单对象无需使用建造者模式。
  2. 线程安全:Builder本身非线程安全,需在build()时完成校验。
  3. 性能开销:额外Builder对象可能增加内存占用(可复用Builder优化)。

总结
建造者模式通过分步构建链式调用,优雅解决了复杂对象创建难题。结合不可变对象与参数校验,可显著提升代码健壮性。在参数众多、构造流程复杂或需多版本对象的场景下,该模式是提升代码可维护性的利器。

今天文章就分享到这儿,喜欢的朋友可以关注我的公众号,回复“进群”,可进免费技术交流群。博主不定时回复大家的问题。
公众号:吴计可师

公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值