Builder模式
简介
分类
解决问题
适用场景
需要生成的实例结构复杂
示例程序的类图
解析
该示例一共涉及到了4个角色,分别为Builder建造者、ConcreteBuilder具体的建造者、Director监工、Client使用者。
Builder的作用在于面向抽象类和接口编程这一思想,而Director与Builder的关系,就如同父类与子类一般,因为虽然Director并不是Builder的父类,但是它就像Template模式中,父类定义方法以及使用方式,由子类去实现具体的方法。在这只不过将Templa方法中,定义方法和使用方式两种职能分开。来看一下,Director的类。
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.makeTitle("Greeting");
builder.makeString("从上午至下午");
builder.makeItems(new String[] {
"上午好",
"下午好"
});
builder.makeString("晚上");
builder.makeItems(new String[] {
"晚上好",
"晚安",
"再见"
});
builder.close();
}
}
可以看出,Director注入Builder后,由一个construct方法来具体的执行生成文档这一需求。这与Template模式中,由一个templateMethod来执行需求一样。
书中将Builder称为建造者,在我看来,Builder更像是建造经验,内定义了作为建筑而言可能会出现的步骤,ConcreteBuilder是建筑图纸,Director是建造流程,对建筑流程做具体定制。流程引用建造经验中的步骤,图纸用来具体设计建筑内容,并且内根据建造经验结合实际需求进行了定制化,之后统一整合进流程之中,最后再由客户调用流程完成需求。
总结
Builder模式似乎来源于生活中的建筑过程,将传统的建造过程抽象成为一种通用的设计模式,来完成复杂的实例生成,从而实现需求。使得代码的可读性更强,流程更清晰。让笔者好奇的地方在于,将Template模式中父类的职能划分给了两个类,用来执行不同的功能的意义在哪,此处似乎可以将Director的construct写进Builder内,但是该案例和模式的类图并没有这么做,之后我思考了一下,用我总结的方式来理解这个模式,那就是建筑过程可能还会糅合其他的类,比方说用到了物理学的理论,那就不单单只是引用了建筑经验而已。例子或许举的不恰当,但是体现的思想便是,建筑过程并不完全依赖于单一的建筑经验。