这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战
概述
建造者模式(Builder Pattern)是一种复杂的创建型模式,它将一个复杂对象的构建与表示分离,使
同样的构建过程可以创建不同的表示。
建造者模式最主要的功能是基本方法调用顺序的安排,基本方法已经实现,顺序不同产生的对象也不同。例如:张三开了一家水壶制造厂,水壶有两道工序,打磨和喷漆,但都不是必须的,先打磨后喷漆和先喷漆后打磨,所生产出来的水壶是不同的。水壶制造厂就是具体建造者;定义打磨和喷漆两个工序就属于抽象构造者;水壶就是具体产品;打磨和喷漆的先后顺序就是指挥者负责的。
结构
- Builder(抽象建造者):在该抽象类或接口中一般有两类方法,其中一类方法用于指定具体产品的构建,构建方法有一个或多个,它们用来指定具体产品的属性;另一类方法为具体产品的表现,有且仅有一个,这个方法用来返回具体的产品。
- ConcreteBuilder(具体建造者):具体实现产品的构建和表现。
- Product(具体产品):具体产品类。
- Director(指挥者):负责安排产品的构建顺序,一般在其建造方法中调用建造者对象的构建方法和装配方法,完成复杂对象的建造。
- Client(客户端):客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者 Setter 方法将该对象传入指挥者类中。
优点
- 客户端不必知道产品内部组成的细节,符合迪米特法则。
- 具体的建造者类之间是相互独立的,符合开闭原则,有利于系统的扩展。
- 可以逐步细化构建方法,便于控制细节风险。
缺点
如果产品内部变化复杂,就需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
应用场景
产品的构建顺序不同会产生不同的结果时,使用建造者模式。
JDK 中的应用
java.lang.StringBuilder
就使用了建造者模式。
java.lang.Appendable
是抽象建造者。
1 | java复制代码public interface Appendable { |
java.lang.AbstractStringBuilder
是具体建造者。
1 | java复制代码abstract class AbstractStringBuilder implements Appendable, CharSequence { |
java.lang.StringBuilder
是指挥者。
1 | java复制代码public final class StringBuilder |
本文转载自: 掘金