Builder模式是设计模式中比较少争议的一个,其实也是比较有内容的一种。
我们先来看Builder模式的结构,它由四个部分组成:Director , Builder , Builder实现类,Product类。Part作为Product内部的概念被隐藏了。它的设计初衷是将复杂对象的构成(也就是部件)和构建逻辑(也就是算法或者说处理顺序)分离开来。换成现实中最简单的例子,一堆积木玩具,按照图纸,可以堆砌不同的的建筑。其中积木就相当于Part,图纸相当于Director,而建筑就是Product了。当然,这样的例子还是会让人有些糊涂,比如说什么是Builder的实现呢?实际上在这个例子中,积木已经是形成的单元了,它就是Builder的产物而已。
面对这样一个看似简单的模式,初学者又会有这样的疑问,我们使用Builder的目的究竟是想返回不同的实例(都是Product的一种实现)还是根据返回另外的某种实例(只是某些Part没有builder)呢?让我们看看《设计模式:可复用面向对象软件的基础》一书中举的例子,书中Builder的三个实现类ASCIIConvertor , TexConverter 和TextWidgetConverter有各自的getResult的方法(getASCIIText, getTexText, getTextWidget),并且返回不同的类型。那么说明Builder返回的是后者,也就是另外的实例。
这时,我们又来对比一下Jdon网站板桥关于builder的举例,也就是关于汽车和汽车部件的例子(http://www.jdon.com/designpatterns/builder.htm),或者联想一下,在现实生活中,经常有这样的情况。比如说:一种汽车,有豪华版,舒适版,经济版等,都是一种产品,但是内部的部件搭配不同。那么他们是否又能使用Builder模式呢? 或者说,板桥所举的例子不是标准的Builder模式?
似乎不敢确定答案,好,我们再回头看看GOF关于builder模式的适用范围:
  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。
其实这两种范围也就是描述了Builder模式的两种应用场景。第一种也就是板桥所举的关于汽车的例子,同样一种builder实例,可以根据Director来获得同一产品不同的实现,它关注的是分离对象的构造算法和组成部分。而第二种也就是原书中的例子,不同的builder获得不同的产品,它关注的是被构造对象的不同。
 
这样一看,大家是否比较豁然开朗,对不同的Builder和Director关注度,会给我们带来不同的应用。而在绝大多数文章中,是没有提到这点的,或者说并没有清晰的谈到这点。
 
正因为有两种不同侧重点的应用,所以当对问题分析不够透彻时,或者对模式侧重点不明晰时,我们往往会使用了不太合适的实现。这样,也就会让人感到一些奇怪和误解,同时也限制了调用者的可扩展性。(我们往往重视模式结构单元的可扩展性,确又忽略了调用者的扩展性。)
 
  • 6835bc85-7b15-491f-830a-6bb828fbd89e-thumb
  • 描述:
  • 大小: 15.6 KB
  • D66ec09b-0af7-457e-9fa5-c0de013a37b0-thumb
  • 描述:
  • 大小: 16.1 KB
评论
发表评论

您还没有登录,请登录后发表评论

凤舞凰扬
搜索本博客
最近加入圈子
存档
最新评论
评论排行榜