【HeadFirst系列之HeadFirst设计模式】第16天之生成器模式(Builder Pattern):让对象构建更优雅!

🚀 生成器模式(Builder Pattern):让对象构建更优雅!

"遇到复杂对象构建?试试生成器模式!"

在日常开发中,我们经常会遇到 创建对象属性过多、构造方法过长、可选参数混乱 的问题。这时候,我们就需要 生成器模式(Builder Pattern) 来简化对象的创建过程,让代码更加清晰、可维护。

本篇文章基于 《Head First 设计模式》 ,带你深入理解 生成器模式的核心思想、应用场景、优缺点,以及在 JDK 和 Spring 框架中的实践,并提供 Java 代码示例,助你高效掌握这一重要设计模式!🚀


🎭 先看问题:对象创建的痛点

假设我们有一个 复杂的 Product,有多个可选参数:

java 复制代码
public class Product {
    private String name;
    private double price;
    private String manufacturer;
    private String category;
    private int stock;
    
    public Product(String name, double price, String manufacturer, String category, int stock) {
        this.name = name;
        this.price = price;
        this.manufacturer = manufacturer;
        this.category = category;
        this.stock = stock;
    }
}

❌ 遇到的问题

1️⃣ 构造方法参数过多,调用时容易混淆

java 复制代码
Product product = new Product("Laptop", 999.99, "Apple", "Electronics", 100);

如果参数顺序错了,比如把 pricestock 位置写反,就会导致 难以发现的 Bug

2️⃣ 不支持部分参数可选

比如,有些 Product 可能不需要 manufacturer,但是 Java 没有默认参数,我们只能重载多个构造方法,导致代码臃肿:

java 复制代码
public Product(String name, double price, String category) {
    this(name, price, "Unknown", category, 0);
}

3️⃣ 可读性差,扩展困难

如果后续增加新属性,比如 discount(折扣),就需要 修改所有构造方法 ,破坏了开闭原则(OCP)


🎯 解决方案:引入生成器模式

生成器模式(Builder Pattern) 通过 链式调用分步骤构造,让对象创建更加优雅!

1️⃣ 设计 ProductBuilder

java 复制代码
public class Product {
    private String name;
    private double price;
    private String manufacturer;
    private String category;
    private int stock;

    // 私有构造函数,防止直接创建对象
    private Product(ProductBuilder builder) {
        this.name = builder.name;
        this.price = builder.price;
        this.manufacturer = builder.manufacturer;
        this.category = builder.category;
        this.stock = builder.stock;
    }

    // 静态内部类:Builder
    public static class ProductBuilder {
        private String name;
        private double price;
        private String manufacturer = "Unknown"; // 默认值
        private String category = "General"; // 默认值
        private int stock = 0;

        public ProductBuilder(String name, double price) {
            this.name = name;
            this.price = price;
        }

        public ProductBuilder manufacturer(String manufacturer) {
            this.manufacturer = manufacturer;
            return this;
        }

        public ProductBuilder category(String category) {
            this.category = category;
            return this;
        }

        public ProductBuilder stock(int stock) {
            this.stock = stock;
            return this;
        }

        public Product build() {
            return new Product(this);
        }
    }
}

2️⃣ 使用 Builder 模式创建对象

java 复制代码
Product product = new Product.ProductBuilder("Laptop", 999.99)
        .manufacturer("Apple")
        .category("Electronics")
        .stock(100)
        .build();

✅ 生成器模式的优势

🔹 避免构造方法参数混乱 ,可读性更强

🔹 支持可选参数 ,避免构造方法重载

🔹 易于扩展 ,添加新字段不影响已有代码

🔹 支持链式调用,代码更加优雅


🎯 生成器模式的适用场景

创建复杂对象 (参数过多、可选参数多的对象)

对象不可变 (比如 String,创建后不可修改)

避免构造方法重载 (减少代码膨胀)

提高代码可读性(链式调用,清晰直观)


🔍 生成器模式在 JDK 和 Spring 框架中的应用

📌 1. JDK 中的应用:StringBuilder

StringBuilder 采用 生成器模式 来高效拼接字符串:

java 复制代码
String result = new StringBuilder()
        .append("Hello ")
        .append("World!")
        .toString();

相比 String不可变性StringBuilder 避免了不必要的对象创建,提高了性能!

📌 2. Spring 框架中的应用:BeanDefinitionBuilder

在 Spring 中,BeanDefinitionBuilder 也是典型的 生成器模式 实现:

java 复制代码
BeanDefinition beanDefinition = BeanDefinitionBuilder
        .genericBeanDefinition(MyService.class)
        .addPropertyValue("name", "Spring Service")
        .setScope(BeanDefinition.SCOPE_SINGLETON)
        .getBeanDefinition();

🔹 可选参数不强制填充 ,避免复杂构造方法

🔹 链式调用,简洁清晰


🎯 生成器模式 vs 工厂模式

对比项 生成器模式(Builder) 工厂模式(Factory)
作用 构造复杂对象,控制构造过程 创建对象,封装 new 过程
是否支持可选参数 ✅ 支持 ❌ 不支持
是否支持链式调用 ✅ 支持 ❌ 不支持
使用场景 复杂对象创建,参数多 只需创建对象,逻辑简单

📌 什么时候用?

  • 参数少,逻辑简单工厂模式
  • 参数多,构造复杂生成器模式

🎉 总结

生成器模式(Builder Pattern) 解决了 构造方法参数混乱、可选参数处理困难、扩展性差 等问题,适用于 创建复杂对象

📌 核心要点:

✔️ 将对象构造过程与对象本身分离

✔️ 支持链式调用,避免构造方法重载

✔️ 可读性高,易扩展,适用于可选参数多的场景

✔️ 在 JDK(StringBuilder)、Spring(BeanDefinitionBuilder)中广泛应用

如果你正在开发 配置类、数据库连接类、复杂的实体类 ,不妨试试 生成器模式,让你的代码更加优雅!💡


💬 你在开发中遇到过哪些对象创建的痛点?欢迎在评论区交流! 🚀

👉 觉得有用?欢迎点赞 + 关注,更多设计模式干货持续更新! 💡

相关推荐
AI人工智能+电脑小能手2 小时前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
AustinXu5 小时前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理
剧中有戏5 小时前
单例模式从入门到精通:一个数据库连接池的完整剖析
设计模式
胡萝卜术5 小时前
编译期与运行期的双重防线:从 TypeScript 类型之争到 LLM 输出的自动化择优
前端·设计模式·面试
货拉拉技术5 小时前
重塑 Agent 度量衡:基于 LLM-as-a-Judge 的离线评估体系与实践
算法·设计模式
KhalilRuan6 小时前
设计模式小记
设计模式
卡牌RWA研究院6 小时前
Relique:一张精品卡牌如何从收藏品变成可交易的链上资产?
设计模式·金融·区块链·创业创新
剧中有戏1 天前
抽象工厂模式从入门到精通:一个多云存储案例的完整剖析(修订版)
设计模式
MC皮蛋侠客1 天前
Redis 系列(八):缓存设计模式与一致性——从 Cache Aside 到防雪崩
redis·缓存·设计模式
莫得感情 o1 天前
设计模式 18 · 状态模式
设计模式·状态模式