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

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 自动生成,无需手写模板代码
相关推荐
我登哥MVP2 小时前
【SpringMVC笔记】 - 6 - RESTFul编程风格
java·spring boot·spring·servlet·tomcat·maven·restful
yhole2 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
zjjsctcdl2 小时前
SpringBoot3.3.0集成Knife4j4.5.0实战
java
沐知全栈开发2 小时前
Java Number & Math 类详解
开发语言
彭于晏Yan2 小时前
Spring Boot 集成邮件服务实现发送邮件功能
java·spring boot·后端
浮尘笔记2 小时前
Java Snowy 框架生产环境安全部署全流程(服务器篇)
java·运维·服务器·开发语言·后端
宸津-代码粉碎机2 小时前
Spring Boot 4.0虚拟线程实战续更预告:高阶技巧、监控排查与分布式场景落地指南
java·大数据·spring boot·分布式·后端·python
Rsun045512 小时前
6、Java 适配器模式从入门到实战
java·开发语言·适配器模式
MaCa .BaKa2 小时前
52-考研备考服务平台系统-考研系统
java·spring boot·mysql·考研·tomcat·maven·mybatis