建造者模式/生成器模式
1. 介绍
1.1 功能
- 将一个复杂的对象的构建与它的表示分离、解耦
- 是一种创建型模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
- 可以使得相同的创建过程可以创建不同的产品对象
- 建造者模式是一步创建一个复杂的对象 ,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节 。
- 增加新的具体建造者无需修改原有代码
建造者模式所创建的产品一般具有较多共同点。如果其组成部分相似如果产品之间 的差异性很大,则不适合使用建造者模式 ,因此其使用范围受到一定的限制 。
1.2 四个角色
- Product(产品角色): 一个具体的产品对象,包含多个部件。
- Builder(抽象建造者): 创建一个Product对象的各个部件指定的接口/抽象类
- ConcreteBuilder(具体建造者):实现接口,实现具体建造的流程,构建和装配各个部件。
- Director(指挥者/导演):构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。
导演的作用,一是隔离了客户与对象的生产过程,二是负责控制产品对象的生产过程。导演类起到封装的作用,避免高层模块深入到建造者内部的实现类。在建造者模式比较庞大时,导演类可以有多个。
在实际开发中,我们的产品创建通常有几个固定流程,通过这几个固定流程可以建造固定型号的几个产品。导演正式把这些型号的具体细节给隐藏了,客户端只需要清楚自己要哪种型号的哪个产品即可,不必知道这个型号的具体细节
1.3 代码搭建
2. 使用场景
-
相同的方法,不同的执行顺序,产生不同的事件结果时
-
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时
-
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能
-
在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。
该种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计的最初目标。
3. 工厂模式和建造者模式
建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。
建造者模式最主要的功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗地说就是零件的装配,顺序不同产生的对象也不同。
而工厂方法则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的。采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。
4. JDK源码分析
StringBuilder继承于AbstractStringBuilder,这个抽象类实现了Appendable接口。
Appendable接口定义了多个append方法(抽象方法),因此Appendable接口可以被视为抽象建造者,定义了抽象方法。
而AbstractStringBuilder虽然是抽象类,但它已经提供了多个方法的具体实现,可以被视为具体建造者(只是不能实例化)
StringBuilder既充当指挥者,又充当建造者(不过其建造方法的实现是由AbstractStringBuilder完成的)
5. 拓展
建造者模式可以联系模板方法模式