设计模式是有效的架构设计方法,甚至可以说是面向对象编程的范例,不过,学习设计模式比学习一种同类型的语言(比如Java之于C#)困难得多。
简历中不少人会或多或少提到设计模式,但是真的问时,大多又是只能说出“工厂”,“单例”之类的模式,这些模式是比较简单,同时也是重要的模式,不过,创建型模式更像味精,用于调味其它的结构性模式,脱离了结构性模式,创建型模式也就失去了存在的意义。
所以,从这个角度来说,GoF虽然能力很强,写书的水平实在不怎么样,把创建型模式放在前面,失去了循序渐进的好处,使得很多人停留在了“工厂”,“单例”,却不真的知道为什么要用它们。
但是,不少结构性模式的差别很微妙,也比较难精通,在我看来,对于初学者,很多停留在“工厂”“单例”固然不好,即使能一股脑把23种经典设计模式都看完,也不是一个正确的做法,只会在这些微妙差别中迷失。
所以,我推荐给初学者的做法是:忘掉所有你阅读过的设计模式,承认自己完全不理解设计模式,并且主攻一种我认为最基础,或者说最重要的结构性设计模式:策略模式。
或者更进一步,也不要想什么策略模式,而是去熟悉面向对象的基础知识,了解什么叫接口,并且在你的项目中,极力思考什么情况下,使用接口可以灵巧的实现需 求,而且针对未来可能的同类型改变,可以轻松的应对?极力思考使用接口怎样可以分离类和类之间的关系,使之都依赖于接口,而不是互相纠缠在一起。使用类图 可能能更好的帮助你进行设计,从类图上,查看你的类之间的关系,使用你能想到的方法,消除扑朔迷离的类依赖,使之尽量清晰、简洁。一旦你完成了面向接口编 程的转变,你会发现,你自然而然的需要一种方式,来创建你的接口的派生类,也就是工厂模式,有时候,简单工厂不能满足要求,可能还需要进行一些扩展……
现在,再回来从头阅读一遍GoF的那本薄薄的小书《设计模式》,你可能会发现有些创建型模式正是你项目里需要的,很多结构性模式和你使用接口的方法是如此 相像,也许你会发现你不止重新“发明”了一种模式,而这一次,因为你完全理解为什么你需要使用接口,为什么需要使用工厂,也才能准确的理解相似的模式之间 的些微差异,并且对不同模式的使用时机进行更好的评估。你也会发现,有一些模式,比如中介者,对于 .Net 开发人员来说,几乎人人天天都在用;有一些模式,比如原型,使用反射加特性可以更好的实现等等。现在我想你会和我一样的觉得,原来面向对象编程的真谛在于 设计模式……
最后说两句题外话:一,无论什么时候,通读一遍MSDN都是一个快速提高的好方法;二,软件设计很多时候是在选择,并不是使用新技术就一定是好的,并不是多用设计模式就一定是好的,将正确的技术,用在正确的地方,才是一个软件设计师的能力所在。
简历中不少人会或多或少提到设计模式,但是真的问时,大多又是只能说出“工厂”,“单例”之类的模式,这些模式是比较简单,同时也是重要的模式,不过,创建型模式更像味精,用于调味其它的结构性模式,脱离了结构性模式,创建型模式也就失去了存在的意义。
所以,从这个角度来说,GoF虽然能力很强,写书的水平实在不怎么样,把创建型模式放在前面,失去了循序渐进的好处,使得很多人停留在了“工厂”,“单例”,却不真的知道为什么要用它们。
但是,不少结构性模式的差别很微妙,也比较难精通,在我看来,对于初学者,很多停留在“工厂”“单例”固然不好,即使能一股脑把23种经典设计模式都看完,也不是一个正确的做法,只会在这些微妙差别中迷失。
所以,我推荐给初学者的做法是:忘掉所有你阅读过的设计模式,承认自己完全不理解设计模式,并且主攻一种我认为最基础,或者说最重要的结构性设计模式:策略模式。
或者更进一步,也不要想什么策略模式,而是去熟悉面向对象的基础知识,了解什么叫接口,并且在你的项目中,极力思考什么情况下,使用接口可以灵巧的实现需 求,而且针对未来可能的同类型改变,可以轻松的应对?极力思考使用接口怎样可以分离类和类之间的关系,使之都依赖于接口,而不是互相纠缠在一起。使用类图 可能能更好的帮助你进行设计,从类图上,查看你的类之间的关系,使用你能想到的方法,消除扑朔迷离的类依赖,使之尽量清晰、简洁。一旦你完成了面向接口编 程的转变,你会发现,你自然而然的需要一种方式,来创建你的接口的派生类,也就是工厂模式,有时候,简单工厂不能满足要求,可能还需要进行一些扩展……
现在,再回来从头阅读一遍GoF的那本薄薄的小书《设计模式》,你可能会发现有些创建型模式正是你项目里需要的,很多结构性模式和你使用接口的方法是如此 相像,也许你会发现你不止重新“发明”了一种模式,而这一次,因为你完全理解为什么你需要使用接口,为什么需要使用工厂,也才能准确的理解相似的模式之间 的些微差异,并且对不同模式的使用时机进行更好的评估。你也会发现,有一些模式,比如中介者,对于 .Net 开发人员来说,几乎人人天天都在用;有一些模式,比如原型,使用反射加特性可以更好的实现等等。现在我想你会和我一样的觉得,原来面向对象编程的真谛在于 设计模式……
最后说两句题外话:一,无论什么时候,通读一遍MSDN都是一个快速提高的好方法;二,软件设计很多时候是在选择,并不是使用新技术就一定是好的,并不是多用设计模式就一定是好的,将正确的技术,用在正确的地方,才是一个软件设计师的能力所在。