Design Pattern/设计模式: A Short Break
如果诸君将前面的从第一章到第八章的博客已经读完,在继续后续的学习以前,我认为我们可以稍加思考,经过这么多个章节,除了那些拗口的名词、设计模式以外,我们究竟学到了什么呢?作为一名程序员,我认为这个阶段我们相当容易陷入的一个怪圈就是“我明白了!如果碰到xx情况的话我应该可以用xx模式!”,然而我认为这样的想法是相当危险的。
就像是每一篇博客写在最前面的内容一样,我希望这一系类的博客能够带给读者以启迪,而不是直接提供解决方案。我当然希望在读完这些博客后诸君在面对手头的问题之时马上就能够手指翻飞就写出低耦合、高复用、可读性极强同时又强健不含bug的代码,然而这当然是不大现实的。
关于设计模式的学习,非常多富有经验的程序员是这样评价的,对于所谓的“代码素人”来说,他们写出来的代码缺乏良好的抽象和接口,这为后续的修改、特性的更新以及和他人共同协作都带来了困难;而对于一些执着于设计模式的“代码达人”来说,盲目的使用设计模式会使得程序的可读性变得糟糕,令程序变得臃肿不堪等等;在实际的生产和应用中在这两者之间去进行平衡才是软件开发的常态。
那么我们之前学习的那些设计模式难道就毫无用处了吗?这里,我请诸君稍微思考一下如下的几个问题
- 在Singleton Mode中,我们为什么要将构造函数设置为private的?
- 在Adapter Mode中,我们是通过什么样的方式,使得我们可以直接使用原有的包来进行新的程序的开发的?
- 我们为什么要使用Iterator Mode,这样能够给我们的代码的开发带来什么样的便利?
- 如何去理解Template Mode中的Template?
- 如何去理解Prototype Mode中的Prototype?
- Factory Mode和Abstract Factory Mode有何异同?
关于这六个问题我的一些想法放在文章的最后了,可能难免有错误或者思考不周之处,有才学之士若是发现还请不吝赐教,以免误人子弟,谢谢!
不过当然了,特意写这一篇博客不是为了讨论这六个问题,而是为了让诸君不要将自己的思维限制在如何通过某种语言去实现一个设计模式的桎梏之中。我认为书中最宝贵的是作为一名程序员,如何去思考要怎样写一个程序,在编程的时候,我们需要去反复的用以下的几个问题来拷问自己
- 是使用类还是使用接口?
- 怎样去设置类之间的继承关系?这个方法应该放在父类之中,还是应该放在子类之中?
- 这个属性/方法,应该设置为public的,private的,还是protected的?
- 有没有必要为了程序的多态性设置一些抽象类?如何进行抽象?
- 如何组织package之间的关系?
- 对于其他的程序调用者来说,调用者可能需要什么样的接口?如何确保程序的修改/更新/迭代对于其他的调用者是不可见的?
- ……
我认为在我们之前的几篇博客中,其实我们在翻来覆去讨论的都是如上的几个问题,故我们也可以使用相同的问题来询问我们自己,以便我们更好的去理解其中的含义。我们在阅读博客的时候,应该抱着案例分析的心态而不是奉为圭臬,时时刻刻去询问自己,为什么我要花这么大的力气来这么做?
关于最上面六个问题的回复,我将自己的理解写在下面了
- 在Singleton Mode中,我们为什么要将构造函数设置为private的?我们通过在Singleton的类中设置一个static的Singleton属性,使其仅在这个类被调用的时候生成唯一的一个实例,private的构造函数确保了我们在程序的其他部分不能新建一个这个类型的实例。
- 在Adapter Mode中,我们是通过什么样的方式,使得我们可以直接使用原有的包来进行新的程序的开发的?我们可以通过写一个Adapter类,在其中声明一个原有的类的属性,然后调用这个属性的方法来使用原本的包。
- 我们为什么要使用Iterator Mode,这样能够给我们的代码的开发带来什么样的便利?Iterator将遍历器和被遍历的对象解耦,这样的话程序的调用者可以不用担心被遍历的对象究竟是数组、字典还是其他的什么数据结构,只要遍历器能够正常的进行工作,那么我们就可以确保程序能够正常的运行。
- 如何去理解Template Mode中的Template?在某些情况中,可能有多个类共享一个复杂的方法/流程,这样我们可以使他们同时继承一个父类,并且在父类中提供这个复杂的方法和流程,而在子类中实现其特定的方法。
- 如何去理解Prototype Mode中的Prototype?在实例的创建/声明比较困难的情况下,我们可以提前建立一些实例,在后续的实例的创建中可以将之前建立的这些实例作为Prototype来进行clone。
- Factory Mode和Abstract Factory Mode有何异同?Factory Mode是一个工厂,可以创建继承特定基类的不同的派生类,而Abstract Factory则是一个可以创建其他类工厂的工厂!