每日一学:设计模式之建造者模式

Java 建造者模式

建造者模式是创建型设计模式之一 ,核心作用:把复杂对象的创建过程和对象本身分离,让同一个构建过程可以创建不同的对象,代码更优雅、易维护,避免多参数构造器的混乱。

简单说:当一个类有很多属性 (比如 5 个以上)、可选参数多,方便。


一、为什么要用建造者模式

假设有一个 Computer 类,属性:CPU、内存、硬盘、显卡、屏幕、键盘......如果用传统方式:

  1. 重叠构造器:写一堆构造方法,参数多到看不懂,极易传错顺序。
  2. setter 方式 :对象创建后才能赋值,无法保证对象不可变,代码零散。
java 复制代码
// 参数多、导致易出错
Computer computer = new Computer("i9", "32G", "1TB", true, true, false);

二、建造者模式标准结构

核心角色

  1. Product(产品):要创建的复杂对象(如 Computer)
  2. Builder(抽象建造者):定义创建产品各部件的接口
  3. ConcreteBuilder(具体建造者):实现接口,完成部件创建和组装
  4. Director(指挥者):调用建造者,控制构建流程(可选,简化版可省略)

三、Java 实战代码

Java 中推荐静态内部类 Builder 写法

1. 完整代码

java 复制代码
// 1. Product:最终要创建的复杂对象
public class Computer {
    // 必选属性
    private final String cpu;
    private final String memory;
    // 可选属性
    private String disk;
    private String gpu;
    private boolean hasScreen;

    // 2. 私有构造器:外部无法直接new,只能通过Builder创建
    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.memory = builder.memory;
        this.disk = builder.disk;
        this.gpu = builder.gpu;
        this.hasScreen = builder.hasScreen;
    }

    // 3. 静态内部类 Builder(核心)
    public static class Builder {
        // 必选属性(用final修饰,强制必须传)
        private final String cpu;
        private final String memory;
        // 可选属性(赋默认值)
        private String disk = "512G";
        private String gpu = "集成显卡";
        private boolean hasScreen = true;

        // 必选参数构造器
        public Builder(String cpu, String memory) {
            this.cpu = cpu;
            this.memory = memory;
        }

        // 链式调用方法:设置可选属性
        public Builder disk(String disk) {
            this.disk = disk;
            return this; // 返回Builder自身,支持链式调用
        }

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

        public Builder hasScreen(boolean hasScreen) {
            this.hasScreen = hasScreen;
            return this;
        }

        // 4. 构建方法:返回最终的Product对象
        public Computer build() {
            return new Computer(this);
        }
    }
}

2. 使用方式(链式调用)

java 复制代码
public class Test {
    public static void main(String[] args) {
        // 链式创建对象
        Computer computer = new Computer.Builder("i9-14900K", "32G")
                .disk("2TB SSD")
                .gpu("RTX 4090")
                .hasScreen(true)
                .build();

        System.out.println(computer);
    }
}

四、核心优点

  1. 代码可读性极高disk("2TB") 一眼就知道是设置硬盘,不会传错参数
  2. 支持链式调用:一行代码完成创建,简洁美观
  3. 保证对象不可变 :用 final 修饰属性,对象创建后无法修改
  4. 解耦创建与使用:复杂的组装逻辑藏在 Builder 里,调用方无需关心
  5. 灵活扩展:新增属性只需要修改 Builder,不影响原有代码

五、适用场景

  1. 类的属性非常多(≥3 个),参数复杂
  2. 存在大量可选参数,不想写一堆构造器
  3. 需要创建不可变对象(属性不允许修改)
  4. 相同的构建步骤,需要创建不同表现的对象

实际项目中:MyBatis-Plus 的查询条件、Lombok 的 @Builder 注解、Spring 中的多种对象构建,都是建造者模式!


六、Lombok 简化建造者

实际开发中,不用手写静态内部类,用 Lombok 的 @Builder 注解 一行搞定:

java 复制代码
import lombok.Builder;
import lombok.ToString;

@Builder // 自动生成建造者模式代码
@ToString // 自动生成toString
public class Computer {
    private String cpu;
    private String memory;
    private String disk;
    private String gpu;
}

使用方式完全一样:

java 复制代码
Computer computer = Computer.builder()
        .cpu("i9")
        .memory("32G")
        .disk("1TB")
        .build();

总结

  1. 建造者模式 = 分离复杂对象的创建 + 组装
  2. Java 最佳实践:静态内部类 Builder + 链式调用
  3. 核心优势:可读性高、代码优雅、对象不可变
  4. 适用场景:多参数、多可选属性的复杂对象
  5. 开发神器:Lombok @Builder 自动生成,无需手写模板代码
相关推荐
万法若空1 小时前
【算法-查找】查找算法
java·数据结构·算法
殳翰2 小时前
下服务器端开发流程及相关工具介绍(C++)
开发语言·c++
落寞的星星2 小时前
这个对象就包含了已经转换好的DFA和各种词法分析器运转所需要的参数。下一步,我们就可以用ScannerInfo对象创建出Scanner对象,请看下面的代码:
开发语言·c#
nothing&nowhere2 小时前
用 Python 做问卷数据清洗:无效样本检测与处理实战
开发语言·python·数据清洗·数据处理·问卷星·问卷星脚本·刷问卷
2601_961593423 小时前
Rust 开发环境配置繁琐?RustRover 开箱即用搞定编码调试
开发语言·后端·macos·rust
researcher-Jiang3 小时前
Design Patterns——Template Method入门到情景实战
python·设计模式·模板方法模式
HZZD_HZZD3 小时前
DL/T 645-2026新国标深度解读与智能电表协议适配实战:从帧结构变化到Java采集器升级的全链路改造方案
java·开发语言
多加点辣也没关系5 小时前
JavaScript|第4章:类型转换
开发语言·javascript
聪慧的水蜜桃5 小时前
【YFIOs】用C#开发硬件之设备上云
开发语言·c#