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

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 自动生成,无需手写模板代码
相关推荐
麻瓜生活睁不开眼4 小时前
Android16修改全局桌面视图边框四直角显示为弧边圆角
android·java·深度学习
dear_bi_MyOnly4 小时前
【MyBatis 操作数据库】
java·数据库·学习·mybatis·学习方法
workflower4 小时前
装备企业的 AI 路线图
人工智能·深度学习·机器学习·设计模式·机器人
Wang's Blog4 小时前
Go-Zero 项目开发43:基于 Filebeat 收集各个服务的日志信息
开发语言·golang·go-zero·filebeat
2601_953720824 小时前
【计算机毕业设计】基于Spring Boot的心理健康咨询与评测系统的设计与实现
java·spring boot·后端
丈剑走天涯5 小时前
JDK 17 正式特性
java·开发语言
秋田君6 小时前
QT_QFontDialog类字体对话框
开发语言·qt
圣光SG6 小时前
Java操作题练习(七)
java·开发语言·算法
麻瓜老宋7 小时前
AI开发C语言应用按步走,表达式计算器calc的第二十三步,多行输入、进制输出、错误恢复、常量折叠、配置加载等
c语言·开发语言·atomcode
q567315237 小时前
企业级 HTTP 代理采购选型:技术评估清单 15 项
开发语言·网络·爬虫·网络协议·http·隧道ip·代理ip