建造者模式的意义在于:为了防止客户端程序员因不熟悉某些部件的构造工序或者构成成分,而因为疏忽导致的最终成品残次。
打个比方,你要写一个画人的程序。人有一个头,一个身体,双手和双腿。然而,不同的人有不同的尺寸,画出来的各部分的大小也不一样,但是它们的构成是一样的。(在这种情景下,建造者模式便应该浮上脑海了)。
这个时候,如果你让客户端程序员直接针对每个人都自己一步步画人的话,很有可能存在因为疏忽而忘了画人的某个部分的情况。为了防止出现这种情况,建造者模式利用面向对象的抽象类的实现类必须把所有的抽象方法都覆盖的特性,要保证工序完整。
而利用多态的特性,不同的实现类可以在确保同样的工序的同时,在实现抽象方法的时候选择不同的大小特性。
然而,读到这里,你可能会问,那客户端程序员还要知道有哪些方法在里面呀(工序)?这时候就不得不提起建造者模式中最重要的指挥官(Director)类。指挥官类和工厂类有类似的用途。为了让客户端程序员不需要太关心实现的细节。只要调用这个中介,这个中介就会根据你传递的信息(工厂类便是字符串,指挥官类便是对象的引用),完成你所需要的流程(工厂类:生成你需要的对象;指挥官类:调用所有的步骤)。
就上面的例子,写出来的代码如下:
interface PersonBuilder {
public void drawHead();
public void drawHands();
public void drawFoots();
public void drawBody();
}
class ThinPerson implements PersonBuilder{
@Override
public void drawHead() {
System.out.println("Draw thin person head");
}
@Override
public void drawHands() {
System.out.println("Draw thin person hands");
}
@Override
public void drawFoots() {
System.out.println("Draw thin person foots");
}
@Override
public void drawBody() {
System.out.println("Draw thin person body");
}
}
class FatPerson implements PersonBuilder{
@Override
public void drawHead() {
System.out.println("Draw Fat person head");
}
@Override
public void drawHands() {
System.out.println("Draw Fat person hands");
}
@Override
public void drawFoots() {
System.out.println("Draw Fat person foots");
}
@Override
public void drawBody() {
System.out.println("Draw Fat person body");
}
}
class Director {
public void construct(PersonBuilder pb) {
pb.drawHead();
pb.drawBody();
pb.drawHands();
pb.drawFoots();
}
}
public class BuilderP {
public static void main(String[] args) {
PersonBuilder ins = new ThinPerson();
Director direct = new Director();
direct.construct(ins);
}
}