【设计模式】建造者模式(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教程 - 廖雪峰的官方网站

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

相关推荐
sxlishaobin23 分钟前
设计模式之装饰器模式
java·设计模式·装饰器模式
sxlishaobin1 小时前
设计模式之享元模式
java·设计模式·享元模式
HL_风神1 小时前
设计原则之开闭原则
c++·学习·设计模式·开闭原则
刀法孜然1 小时前
23种设计模式 3 行为型模式 之3.5 memento 备忘录/快照模式
设计模式
__万波__1 小时前
二十三种设计模式(二十一)--状态模式
ui·设计模式·状态模式
a3535413822 小时前
设计模式-代理模式
c++·设计模式·代理模式
sxlishaobin18 小时前
设计模式之原型模式
设计模式·原型模式
范纹杉想快点毕业19 小时前
嵌入式通信核心架构:从状态机、环形队列到多协议融合
linux·运维·c语言·算法·设计模式
__万波__19 小时前
二十三种设计模式(二十)--解释器模式
java·设计模式·解释器模式
攀登的牵牛花19 小时前
前端向架构突围系列 - 架构方法(一):概述 4+1 视图模型
前端·设计模式·架构