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

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

相关推荐
我真的是大笨蛋40 分钟前
MVCC解析
java·数据库·spring boot·sql·mysql·设计模式·设计规范
Engineer邓祥浩1 小时前
设计模式学习(25) 23-23 责任链模式
学习·设计模式·责任链模式
半桔1 小时前
【设计模式】策略模式:可插拔算法,从硬编码到灵活适配,体会“算法解耦“思想
java·c++·算法·设计模式·策略模式
Engineer邓祥浩1 小时前
设计模式学习(23) 23-21 状态模式
学习·设计模式·状态模式
钦拆大仁2 小时前
Java设计模式-中介者模式
设计模式·中介者模式
忧郁的Mr.Li16 小时前
设计模式--工厂模式
设计模式
HL_风神18 小时前
C++设计模式浅尝辄止
c++·设计模式
会员果汁19 小时前
22.设计模式-享元模式(Flyweight)
设计模式·哈希算法·享元模式
亓才孓21 小时前
[设计模式]单例模式的懒汉式写法
单例模式·设计模式
小码过河.1 天前
设计模式——访问者模式
设计模式·访问者模式