建造者模式
建造者模式也是对象创建模式,主要用于构建复杂的组成对象。既对象类由多个组件组成,如汽车由引擎/轮子/方向盘/框 架等部分组成。建造者模式的目的在于,在客户端制定特性类型的前提下,透明的创建这些组件并组成最终产品,而这一切对客户端是透明的。而且扩展不同的复杂对象类时,要易于扩展。
定义:
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。 |
product:最终产品。包含多个组件。
Builder : 抽象建造者,定义了各个部件的抽象创建方法,和返回最终结果的方法。
ConcreteBuilder: 具体建造者,根据具体产品实现Builder的方法。
Director : 指挥者,负责安排部件的构建顺序等构建步骤。客户端只需与指挥者交互,客户端通过实例化具体建造者并传给指挥者,之后的任务就交给了指挥者。指挥者按照事先定义好的步骤调用具体建造者的实现方法。最终指挥者将构建好的产品对象返回给客户端。这样整个过程就完成了。
在该模式中,客户端只需要知道带创建的类型即可,其他的任务都交给指挥者,隔离了创建的具体细节。同时增加新类型,只需增加一个新的具体实现类即可,完全符合开闭原则。
上面的结构是相对标准的建造者模式的结构,下面介绍一些灵活的变通。
- 可以将Director省略掉,将指挥者的construct方法放到抽象建造者中定义。
abstract class AnmBuilder {
protected Anm anm= new Anm ();
public abstract void buildName();
public abstract void buildAge();
public Anm construct() {
this.buildName();
this.buildAge();
return anm;
}
}
或者
public static Actor construct(AnmBuilder ab) {
this.buildName();
this.buildAge();
return anm;
}
- 钩子方法:上述结构中,产品组件的构造和产品的组装步骤都在指挥者内定义好了,难免有些不够灵活。通过引入构字方法,让具体的构造者可以在一定范围内反控制构造过程,增加灵活性。例如在上例的抽象构造者中定义getBuildAge方法,来控制是否构造Age组件,则在指挥者中可以这样实现反控制:
public static Actor construct(AnmBuilder ab) {
this.buildName();
if(ab.getBuildAge()) {
this.buildAge();
}
return anm;
}
总结:
优点:
- 将客户端和具体构造细节隔离开,创建和使用解耦。
- 具体创建者间相互独立,增加新产品无需改动原有构造者。
- 产品往往需要拥有较大的共同点,如果差异性很大,建造者模式很难处理。
- 如果产品内部复杂多变,具体建造者的数量和复杂度都会很大,使系统复杂化。
- 产品有多个属性,并且属性间的构造有一定依赖和逻辑性
- 不同产品件有较高的共同点,可以抽象出一个相对统一的组装过程(指挥者)。
- 希望将对象的构造和使用解耦,隔离创建和使用,以便分工做系统模块更加清晰。