【设计模式】建造者模式(Builder Pattern)详解

文章目录

    • [1. 引言:构造函数为什么会"失控"?](#1. 引言:构造函数为什么会“失控”?)
    • [2. 什么是建造者模式(亦称生成器模式)](#2. 什么是建造者模式(亦称生成器模式))
      • [GoF 定义](#GoF 定义)
    • [3. 建造者模式的核心思想](#3. 建造者模式的核心思想)
    • [4. 建造者模式的角色组成](#4. 建造者模式的角色组成)
    • [5. 示例场景:构建一个电脑对象](#5. 示例场景:构建一个电脑对象)
      • [5.1 产品类](#5.1 产品类)
      • [5.2 客户端使用](#5.2 客户端使用)
    • [6. Director 的角色(可选)](#6. Director 的角色(可选))
    • [7. 建造者模式的优点](#7. 建造者模式的优点)
    • [8. 建造者模式的缺点](#8. 建造者模式的缺点)
    • [9. 适用场景](#9. 适用场景)
    • [10. 建造者模式 vs 构造函数](#10. 建造者模式 vs 构造函数)
    • [11. JDK 中的建造者模式](#11. JDK 中的建造者模式)
      • `StringBuilder`
      • [`StringBuilder` / `StringBuffer`](#StringBuilder / StringBuffer)
    • [12. 建造者模式的一个常见误区](#12. 建造者模式的一个常见误区)
    • 参考

1. 引言:构造函数为什么会"失控"?

在实际开发中,我们经常会遇到这样的类:

java 复制代码
public class User {
    private String username;
    private String password;
    private int age;
    private String phone;
    private String address;
    private String email;

    public User(String username, String password, int age,
                String phone, String address, String email) {
        ...
    }
}

问题显而易见:

  • 构造函数参数过多,可读性差
  • 参数顺序容易写错
  • 可选参数只能传 null
  • 对象一旦创建,很难保证一致性和完整性

当对象的创建过程开始变得"复杂"时,建造者模式就该登场了。


2. 什么是建造者模式(亦称生成器模式)

GoF 定义

将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

一句话理解:

把"怎么一步步组装对象"从对象本身中抽离出来。


3. 建造者模式的核心思想

建造者模式主要解决三个问题:

  1. 构造参数过多的问题
  2. 对象创建过程复杂的问题
  3. 创建不同"配置版本"的对象问题

其核心思想是:

分步骤构建 + 最终一次性生成对象。


4. 建造者模式的角色组成

建造者模式通常包含四个角色:

  1. 产品类(Product)

要创建的复杂对象。

  1. 抽象建造者类(Builder)

这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。

  1. 具体建造者类(ConcreteBuilder)

实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。

  1. 指挥者类(Director,可选)【监工】

调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

结构示意:

在实际 Java 项目中,Director 往往被省略


5. 示例场景:构建一个电脑对象

5.1 产品类

java 复制代码
public class Computer {
    private final String cpu;
    private final String ram;
    private final String disk;
    private final String gpu;

    private Computer(Builder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.disk = builder.disk;
        this.gpu = builder.gpu;
    }

    public static class Builder {
        private String cpu;
        private String ram;
        private String disk;
        private String gpu;

        public Builder cpu(String cpu) {
            this.cpu = cpu;
            return this;
        }

        public Builder ram(String ram) {
            this.ram = ram;
            return this;
        }

        public Builder disk(String disk) {
            this.disk = disk;
            return this;
        }

        public Builder gpu(String gpu) {
            this.gpu = gpu;
            return this;
        }

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

5.2 客户端使用

java 复制代码
public class Client {
    public static void main(String[] args) {
        Computer computer = new Computer.Builder()
                .cpu("Intel i9")
                .ram("32GB")
                .disk("1TB SSD")
                .gpu("RTX 4090")
                .build();
    }
}

优点一目了然:

  • 语义清晰
  • 参数顺序不敏感
  • 可选参数自由组合

6. Director 的角色(可选)

java 复制代码
public class ComputerDirector {
    public Computer buildGamingPC(Computer.Builder builder) {
        return builder
                .cpu("AMD Ryzen 9")
                .ram("64GB")
                .disk("2TB SSD")
                .gpu("RTX 4090")
                .build();
    }
}

Director 的作用:

  • 固定构建流程
  • 封装"套餐配置"

7. 建造者模式的优点

  1. 解决构造函数参数爆炸
  2. 提升代码可读性
  3. 支持不可变对象
  4. 构建过程清晰、可控
  5. 同一构建流程可生成不同对象

8. 建造者模式的缺点

  1. 类数量增多
  2. 结构相对复杂
  3. 不适合简单对象

9. 适用场景

适合使用:

  • 对象属性多、可选参数多
  • 构建步骤固定但配置灵活
  • 需要不可变对象
  • API 设计(非常常见)

不适合使用:

  • 对象非常简单
  • 构建成本低
  • 追求极简代码的场景

造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。


10. 建造者模式 vs 构造函数

维度 构造函数 建造者模式
可读性
参数顺序 敏感 不敏感
可选参数 不友好 友好
不可变对象

11. JDK 中的建造者模式

StringBuilder

java 复制代码
StringBuilder sb = new StringBuilder();
sb.append("Hello")
  .append(" ")
  .append("World");

StringBuilder / StringBuffer

  • 分步构建
  • 最终生成字符串

12. 建造者模式的一个常见误区

建造者模式 ≠ 为所有类都写 Builder。

只有当对象"复杂"到一定程度时,建造者模式才真正有价值。


参考

建造者模式 | 菜鸟教程

建造者模式-百度百科

《图解设计模式》

生成器 - Java教程 - 廖雪峰的官方网站

建造者设计模式(生成器模式)

相关推荐
BD_Marathon1 小时前
七大设计原则介绍
设计模式
YigAin4 小时前
Unity23种设计模式之 享元模式
设计模式·享元模式
范纹杉想快点毕业17 小时前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
茂桑21 小时前
DDD领域驱动设计-基础设施层
设计模式·架构
小温冲冲1 天前
通俗且全面精讲工厂设计模式
设计模式
进击的小头1 天前
设计模式与C语言高级特性的结合
c语言·设计模式
小温冲冲1 天前
通俗且全面精讲单例设计模式
开发语言·javascript·设计模式
Vivienne_ChenW1 天前
DDD领域模型在项目中的实战
java·开发语言·后端·设计模式
sg_knight1 天前
原型模式(Prototype)
python·设计模式·开发·原型模式
短剑重铸之日1 天前
《设计模式》第九篇:三大类型之结构型模式
java·后端·设计模式·组合模式·代理模式·结构性模式