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

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 自动生成,无需手写模板代码
相关推荐
linweidong35 分钟前
中科闻歌Java面试题及参考答案
java·python·大模型·提示词·ai agent·mcp·rag原理
OpenAnolis小助手41 分钟前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
小玮看世界43 分钟前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
ForteScarlet1 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
萧瑟余晖1 小时前
Java深入解析篇六十二之安全机制详解
java·开发语言
小刘在重生~1 小时前
Java 常用类|包装类 装箱拆箱、Integer 缓存面试题
java·python·缓存
Orange_sparkle2 小时前
Pi Agent vs LangGraph:从人机交互、企业 RAG 到持久化工作流的完整选型指南
java·网络·人机交互
菜鸟~noob2332 小时前
【电子战】 第01篇:噪声、门限与虚警/检测概率(PFA/PD)【含matlab代码】
开发语言·matlab
奇牙coding1232 小时前
GPT-6-Astra API 接入教程:OpenRouter 路由配置 + Python/curl 示例 + 静默降级踩坑
开发语言·python·gpt·ai
lzx_0023 小时前
C++11(一)
开发语言·c++·算法