学习设计模式也有很长时间了,说实话,老师以故事的方式讲课,我以前是听不进去的,因为老师所举的例子只是字面上表示那种模式,但实际想一下,不是那么回事,也就是说例子不是那么恰当。其实,对于几种觉的模式,把模式的定义看一下,再结合代码,就能理解了,不要20分钟就能讲完的内容,用2节课还完成不了,这效率谁都知道。最后,只有自己看书,了解设计模式面向对象的三个特征:封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。;继承,它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
;多态,是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
下面,我再讲一下我理解的几个设计模式。
先谈一下工厂模式,它分为简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式:有抽象实现类,具体的实现类,具体的一个工厂类。这个工厂就是负责创建一个与其它类基类类型相同的具体的类实例,好处就是隐藏具体实现类对象,是接口模式的编程方法;工厂方法模式:在简单工厂模式的基础上,加入抽象工厂类,这样,就能创建多个以抽象工厂类为基类的工厂类,每个工厂类对应一个具体实现类,实现各个工厂的单一职责;抽象工厂模式,为了解决工厂方法模式下,工厂类太多复杂的问题,将一些属于同一系列的实现类实例的创建任务放到一个工厂中,类似于公司产品一个系列。我见过的用工厂模式构建的项目中,使用的一般是简单工厂模式,用一个工厂方法,避免文件太多、难以理清的问题。放到一起的是全部的具体类的创建,本来没有联系,在操作的时候,人为的把这些类联系起来操作就行了。
再谈一下单例模式,单例模式在项目中也是很必要的,我在做过的项目中用过了。就是从log4j移植到.net版本的log4net,它用来记录程序的运行状态、错误信息等。在web应用程序中,在程序启动时初始化一个全局的对象Instance,其它地方就可以随时调用了,用它来把信息写入log文件中,实现这种模式的一个方法就是把构造函数设为private,在类的内部new一个静态的Instance,这样就只有一个唯一的对象实例了。我觉得,这个单例模式用的地方也不是太多,因为就看到过log4j或log4net是使用它的一个经典例子,其它的地方也没有了。在项目中的数据访问层,我也想把它们做为单例模式的类,不过,做为一个web应用程序,如果多人用时使用同一功能,是不是会造成死锁的问题?这我还没有测试过,因为现在的环境,三、五个人同时用是没有问题的,关键是人上百或上千、上万的时候,是不是会有问题,这个问题还有待进一步思考。
再谈一下适配器模式,这是一个结构型的模式,现在来讲一下我对它的思想的理解,我喜欢用代码的方法讲,这样具体一些,对于这个适配器模式的概念,也比较抽象,就是你看了它的概念定义也不知道是什么意思。用我做过的项目中的东西讲吧,我做过一个.net代码生成器的东西,那里面要用到数据库类型向C#类型转换的问题,比如说:数据库里面的bigint,在c#中表示为long
。那么,你就要用一个类对它转换,如果你目标方法需要long类型的数据,而源方法只能提供 bigint类型的,那么这个适配器就要担任这个bigint向long类型转换的任务。像这些用到过适配器模式的还有很多,有些比较的隐蔽,可能是几个模式组合使用了,那么,我们没学过这种模式的定义或者思想,那么也不知道它是一个模式。
最后重点谈一下模版方法模式,模版方法模式就是依样画葫芦,定义一个接口类,由子类去继承和实现它定义的方法。这是.Net里面最常用的简单三层框架结构的模式。因为我们在实现功能的时候,最主要的就是对数据的增、删、改、查,既然每个对象都要这些操作,那么这种模版方法模式正好符合要求,可以用同一个模版来约定操作。模版模式,最核心的内容就是一个共同的模版,这样以后的操作都是围绕这个模版进行的,每个类也能自己增加独特的方法(这个并不约束),这就更符合实际编程的需要,对于定义好的模版,也能实现接口设计的原则,对修改关闭,对扩展开放。不过,每种模式都有它的优点和缺点,在接口需求发生改变时,需要修改所有的继承于接口的代码,这是很麻烦的。
总结:其实,我们学习的模式,就是很多种编程的思想,如果没学过这些思想,在遇到难题的时候,也不能想出好的方法来,学习之后就能“套用”这些思想去解决问题了。在项目开发中,往往需要不同的设计模式结合使用,才能满足实际需求,因为一个项目有不同的模块,功能不同适用的设计模式也会不尽相同了。比如:模版方法模式,在对一些有共同方法的对象有用;观察者模式,在类似于向不同的客户发送同一份文件这样的需求时使用;状态模式,在流水线生产这样的环境中适用;创建者模式,在类似于搭配服装的需求时使用。总之,不同的地方适用的设计模式是不同的,这需求结合实际情况使用。不同的设计模式的结合,可以使项目更好地进行。
参考文献:
[1] 郭志学.《易学设计模式》.人民邮电出版社;
[2] James W.Coopper.《C#设计模式》.电子工业出版社
[3] 刘秋香,
王云,
姜桂洪.
《Visual C#.NET程序设计》.清华大学出版社