子非鱼,安知鱼之乐?

我的程序人生,累并快乐着。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#学习笔记系列之三:工厂模式

Posted on 2006-09-03 13:34  Jason Cui  阅读(304)  评论(0编辑  收藏  举报

今天重新翻看BOB大叔的《敏捷编程》,想起了仅有的我能够正确理解和应用的两个设计模式之一:工厂模式。(另一个是Command模式)。于是想试试看C#的代码如何实现工厂模式,结果发现确实跟PHP有不小的区别。

通常最容易想到的用途就是建立数据库工厂用于分别生成OleDB和SqlServer的处理类,通常的作法是建立一个工厂类,接收一个字符串,如果是"Sql",就生成一个Sql数据处理类(基类是一个通用数据库类,包含所要使用的数据库处理函数),并且返回;如果是OLEDB,就生成一个OLEDB类并返回,接收方用基类变量收到返回的参数就可以直接使用其中的函数,而不必关心返回的是什么类,处理的是什么数据库。

然而这个过程中,还是用到了switch语句,说明我们的模式应用还是有问题,还没有达到真正的面向对象。当需要增加一个数据库处理类的时候,不但需要添加这个类所需要的代码,还需要修改工厂类,增加一个Case语句。在PHP中就不存在这个问题,因为PHP对变量是非常宽容的。

最终找到了一个真正解决这个问题的方法,就是通过反射机制。C#中的System.Type类包含一个重要的方法:GetType(name,true),这样就可以得到以该名字所命名的类型的信息。然后利用另一个重要的类System.Activator的一个重要的方法:CreateInstance(type),这样我们就可以在不知道传入的类名的情况下生成该类名所对应的实例。

对工厂类经过这样的改造之后,程序调用端只要根据相关的配置文件传入正确的参数就可以得到正确的实例,而且添加新类的时候只要添加一个数据库处理子类,并通知用户就可以了,无需更改其它任何东西。