Java建造者模式源码剖析及使用场景

一、介绍

Java 中的建造者模式(Builder Pattern)是一种创建型设计模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。该模式主要用于创建一些复杂的对象,这些对象内部由多个部分组成,各部分之间存在着复杂的相互依赖关系。

二、有什么好处?

1.封装性好,构建算法与产品本身分离,构建算法可以被复用。

2.构建过程易扩展,如果需要增加新的部件,只需增加新的构建器类即可,其他代码无须修改。

3.可以控制构建过程顺序,通过指挥者来指定构建顺序。

三、 项目案例

在项目开发中,我们经常会遇到需要构建复杂对象的场景,这时就可以使用建造者模式。比如,我们需要构建一个包含多种信息的电子邮件对象,包括发件人、收件人、主题、正文、附件等。我们可以使用建造者模式来构建这个复杂的邮件对象。

java 复制代码
// 邮件对象
public class Email {
    private String from;
    private List<String> to;
    private String subject;
    private String body;
    private List<File> attachments;
    // 构造函数和getter/setter方法
}

// 邮件建造者
public class EmailBuilder {
    private String from;
    private List<String> to = new ArrayList<>();
    private String subject;
    private String body;
    private List<File> attachments = new ArrayList<>();

    public EmailBuilder setFrom(String from) {
        this.from = from;
        return this;
    }

    public EmailBuilder addTo(String to) {
        this.to.add(to);
        return this;
    }

    // 其他设置方法...

    public Email build() {
        Email email = new Email();
        email.setFrom(from);
        email.setTo(to);
        email.setSubject(subject);
        email.setBody(body);
        email.setAttachments(attachments);
        return email;
    }
}

在上面的示例中,我们定义了一个Email类和一个EmailBuilder类。EmailBuilder提供了一系列方法用于设置邮件的各个部分,最后调用build()方法返回构建好的Email对象。使用这种方式,我们可以链式地调用设置方法,构建过程变得更加清晰和易读。

四、 Java源码案例

在Java标准库中,也有一些地方使用了建造者模式。比如,java.lang.StringBuilder就是一个典型的建造者模式实现。StringBuilder提供了append()方法来追加字符串,我们可以链式地调用多次append()方法,最后调用toString()方法获取构建好的字符串对象。

java 复制代码
StringBuilder sb = new StringBuilder();
sb.append("Hello")
  .append(" ")
  .append("World");
String result = sb.toString(); // 输出 "Hello World"

StringBuilder的append()方法确实体现了建造者模式的思想,它允许我们链式调用append()方法来构建最终的字符串对象。下面我们来看一下StringBuilder的源码,理解它是如何实现建造者模式的。

首先,我们看一下StringBuilder的append()方法签名:

java 复制代码
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

我们继续看append()方法的实现:

java 复制代码
public AbstractStringBuilder append(String str) {
    if (str == null) {
        return appendNull();
    }
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}

这里的核心逻辑是:

  1. 确保StringBuilder内部的字符数组value有足够的容量来存储新追加的字符串;
  2. 将新字符串str的内容复制到value数组中从count位置开始的区域;
  3. 更新count为新的长度;
  4. 返回this对象本身,以支持链式调用。

这种设计模式让我们可以通过链式调用的方式一步步构建最终的字符串对象,而不需要手动拼接字符串。同时,StringBuilder内部也对字符数组进行了优化,避免了频繁地创建新的字符串对象,提高了性能。

除了append()方法,StringBuilder还提供了其他一些方法,如insert()、delete()、reverse()等,这些方法都遵循了相同的建造者模式,返回this对象以支持链式调用。另外在java.util.concurrent.ThreadPoolExecutor的构造函数中,也使用了一个内部建造者类PrivilegedThreadPoolExecutor.PrivilegedThreadFactory来创建线程。

总结:建造者模式通过将对象的构建过程分离出来,使得构建过程变得更加清晰和易于维护。它适用于需要构建复杂对象的场景,可以避免出现过多的构造参数或者复杂的构造逻辑。在实际项目中,我们可以根据具体情况选择是否使用建造者模式来构建对象。

相关推荐
哦虎!5 小时前
【JavaEE】网络初识
java
for_ever_love__5 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
程序猿追6 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓6 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播6 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
欣栀♡6 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
IT研究室7 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项7 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog7 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
墨云安全7 小时前
内网资产无法暴露到公网,怎么做安全检测?2026 年内网渗透测试的落地路径
开发语言·安全·网络安全·渗透测试·php