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

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 自动生成,无需手写模板代码
相关推荐
非优秀程序员5 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻6 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
沐晓时光6 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
文丑颜不良啊8 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang9 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪9 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息10 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼10 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff11 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff12 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc