但凡是模式,总要有一个UML才能说清楚。一般而言,我只记UML图,有些模式有自己的固定实现代码(只是其中一部分),尤其在C#中,甚至只是把用户当作一个Client端,而不暴露其内部实现,只把封装好的模式接口公布。于是,我会再记一些固定方法实现。还有就是适用场合(多看例子),优缺点。最后,横向的看模式与模式之间的比较,联合与差异。以上都做到了,这套心法也就成正果了。 OO的思想也很重要,三个基本特征尤其是多肽,接口与虚拟类,构造体与类,委托,索引,泛型,都是很值得探讨的。 开始正题,先给出Builder的UML图,如下: Builder:生成器,抽象接口,有BuildPart()这样的若干虚方法。 ConcreteBuilder:具体实现者,GetResult()方法返回生成的产品。 Director:导航器,保持一个对接口的引用,可以被Client端实例化,从而通过Concrete()方法(见下),间接操纵ConcreteBuilder中的BuildPart()方法。
这样子,在Director类中,就实现了面向接口编程,即导航器Director在不知道具体是什么样的ConcreteBuilder时,建立接口“对象”b,访问其BuildPart()虚方法。 于是在Client端,我可以这么写:
可以看到,如果要使用ConcreteBuilderB,而不使用原来的ConcreteBuilder类,那么只要更改Client端第1句话为 ConcreteBuilderB b = new ConcreteBuilderB(); 其他都不用更改。这就是Builder模式所要追求的效果。 可以看“画脸谱”这样一个例子,体会Builder模式的使用。代码如下: