GoF —— 一本被误解很深的书
误解1:设计模式只有23种 GoF在前言中就说到“We don’t consider this collection of design patterns complete and static; it’s more a recording of our current thoughts on design.”这本设计模式领域的开山鼻祖,第一扩展了人们的面向对象设计思路,第二则启示人们用模式来总结面向对象设计经验。可惜当前很多设计模式的书籍,逃不出这本书的藩篱,一来讲不出什么新意,二来也不利于读者眼界的开阔。对于已有的设计模式的归纳,可见[1]和[2]。
误解2:书中的每个设计模式已是定式 在书中的每个模式的实现部分,GoF都特别强调variation,什么时候可以省去某个结构,什么时候可以利用语言特性……正如前言中所说,设计模式不是静态的,可以根据需要变化,甚至可以说,在特定的环境下(比如语言),依葫芦画瓢就是误用。而且,不同模式的组合往往才能达到最大的灵活性(见图1.1 Design pattern relationship),而何时该组合、如何组合,则考验设计者功力了。
误解3:设计应该以模式为导向 HFDP(Head First Design Pattern)的作者说,使用设计模式有3个层次: •Beginner——初级的时候无处不用设计模式,认为用的模式越多,设计就越好 •Intermediate——中级的时候知道何时该用什么设计模式,什么时候不该用 •Zen——到了禅的境界,设计模式被用来简化设计,让设计更优雅 把设计模式“塞到”设计中,那就只处于初学者的层次。23种设计模式只是描述了在一个上下文(即书中的Applicability)下的最佳实践,脱离了对应的上下文,往往会造成画虎不成反类犬的效果(Anti-Pattern)。Erich Gamma在接受采访时也承认过去在书中宣扬的方法不当,鼓励refactor to patterns[3]。
误解4:GoF是学习设计模式的必读书 GoF确实是经典,这本书已经出版了15年了,15年在软件工程的历史里可是很长的一段时间。在这15年里,软件工程也发生了很多变化,新的语言、方法、实践层出不穷,smalltalk不再流行,C++也收到很大冲击,现在的OO世界,Java和C#是主流语言。模式虽是独立于实现的,但鉴于每个语言都有不同的特性,对模式的实现有或大或小的差异,对于浸淫在某一门语言中的人,去看针对特定语言的设计模式书收效更大。而另一方面,设计模式的本身也在变化,有些经典的模式不再常用,HFDP的作者直接将GoF中一些不常用的模式扔到了附录中。GoF放在当今,宜作为设计模式的起点读物(读一本是不够的)和参考读物。
总之,创造力是设计师自己的,GoF只是给你一个指引。
[1] http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29
[2] http://c2.com/cgi/wiki?SoftwareDesignPatternsIndex
[3] http://www.artima.com/lejava/articles/reuse2.html