原文地址:https://jaune162.blog/design-pattern/builder-pattern/
引言
现在一般大型的业务系统中的消息通知的形式都会有多种,比如短信、站内信、钉钉通知、邮箱等形式。虽然信息内容相同,但是展现形式缺不同。如短信使用的是纯文本的形式,钉钉使用的一般是Markdown的形式,而邮箱则使用HTML形式。那如何处理这种差异呢?
建造者模式就是一个很好的选择,使用不同的建造者,来构造不同的消息。
定义及实现
建造者模式(Builder Pattern)是一种创建型设计模式,它可以让你构建复杂对象时更加灵活和可控。这种模式的主要目的是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
在软件开发中,我们经常会遇到一些复杂的对象,这些对象通常由多个部分组成,而且每个部分的创建和组合可能需要花费大量的时间和精力。为了解决这个问题,我们可以使用建造者模式来简化对象的构建过程。
建造者模式的核心思想是将复杂对象的构建过程分解为多个简单的步骤,每个步骤负责创建一个特定的部分。这些步骤被封装在一个单独的类中,称为“建造者”(Builder)。通过这种方式,我们可以逐步构建复杂对象,同时保持代码的可读性和可维护性。
定义
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
结构
很多书或者博文中介绍建造者模式的时候都说需要有一个 Director
类,然后在这个类中完成构建过程。这种情况适用于只需要顺序调用Builder的各个方法,即可完成构建过程的情况,或者说Builder的各个方法无参。
关于这种结构更多细节可以参考:https://refactoring.guru/design-patterns/builder
代码实现
具体代码中,使用 AbstractMessageBuilder
抽象 title
和 addLine
方法,因为在3个Builder中,这两个方法的处理逻辑是一致的,不同的只有 build
方法。
@Data
public class Message {private String title;private String content;
}public interface MessageBuilder {void title(String title);void addLine(String label, String desc);Message build();
}@Getter
public class Line {private final String label;private final String desc;public Line(String label, String desc) {this.label = label;this.desc = desc;}
}public abstract class AbstractMessageBuilder implements MessageBuilder {protected String title;protected List<