进入正题咯,今天要介绍的是建造者模式。可以想象一下这样一个场景:工厂要组装人偶的过程,以前是全手工的,难免会出现缺胳膊少腿的情况,现在都是机器流水线,这个问题就避免了。再比如我们经常见到的KFC和金拱门,它们的味道在全世界都是一样的,但是如果我们去一些小餐馆吃饭,每一次去的味道多多少少会有些不同。原因在哪里呢?原因就在与洋快餐把所有的工序都进行了严格的控制,这样生产出来的产品都是一个模子刻出来的;但是小餐馆就不同了,菜好不好吃,完全凭厨师~
所以,在编程中为了效率(比如游戏中要时不时产生敌人),可以将事务的细节部分和公共部分进行分离,这样总可以保证在大体的结构上是不会出错的,也就是不会出现缺胳膊少腿的情况。那么细节部分怎么办呢?下面就要引入建造者模式了。
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。——《大话设计模式》
建造者模式的UML类图如下,以构造小人为例:
可以发现,建造者模式由三个部分组织,第一个部分是抽象类 Builder,它里面规定了人由哪些部分组成,这些都是抽象方法,我们知道,如果子类不实现这些抽象方法的话,程序是编译不成功的,这也从一个侧面保证了构建人物的完整性。第二个部分是ThinBuilder和FatBuilder,它们继承Builder类,很显然,这两个类是用来处理构建人物的具体细节的,这也回答了我们上边遗留的那个问题。最后一个部分是Director类,指挥者类,由它来控制人的组装,从另一个方面保证完整性。这个类同时也是对外的,开发人员只需直接与Director类打交道即可,只要告诉它我们要什么样子的人,比如胖人,瘦人等,这个Director类会使用多态来创造我们需要的东西,无需知道构建的细节。
将构建人物的例子转化为代码如下:
import java.util.*;
abstract class Builder
{
public abstract void buildHead();
public abstract void buildBody();
public abstract void buildLeftArm();
public abstract void buildRightArm();
public abstract void buildLeftLeg();
public abstract void buildRightLeg();
}
class ThinBuilder extends Builder
{
public void buildHead()
{
System.out.println("构建头部...");
}
public void buildBody()
{
System.out.println("构建身体,这个人比较瘦...");
}
public void buildLeftArm()
{
System.out.println("构建左臂...");
}
public void buildRightArm()
{
System.out.println("构建右臂...");
}
public void buildLeftLeg()
{
System.out.println("构建左腿...");
}
public void buildRightLeg()
{
System.out.println("构建右腿...");
}
}
class FatBuilder extends Builder
{
public void buildHead()
{
System.out.println("构建头部...");
}
public void buildBody()
{
System.out.println("构建身体,这个人比较胖...");
}
public void buildLeftArm()
{
System.out.println("构建左臂...");
}
public void buildRightArm()
{
System.out.println("构建右臂...");
}
public void buildLeftLeg()
{
System.out.println("构建左腿...");
}
public void buildRightLeg()
{
System.out.println("构建右腿...");
}
}
class Director
{
public void createPerson(Builder bt)
{
bt.buildHead();
bt.buildBody();
bt.buildLeftArm();
bt.buildRightArm();
bt.buildLeftLeg();
bt.buildRightLeg();
}
}
public class Main
{
public static void main(String args[])
{
ThinBuilder tb = new ThinBuilder();
FatBuilder fb = new FatBuilder();
Director d = new Director();
d.createPerson(tb);
d.createPerson(fb);
}
}
程序运行效果如下:
构建头部...
构建身体,这个人比较瘦...
构建左臂...
构建右臂...
构建左腿...
构建右腿...
构建头部...
构建身体,这个人比较胖...
构建左臂...
构建右臂...
构建左腿...
构建右腿...