反射 + 抽象工厂模式切换DB数据源(附Demo)
首先,设计模式的文章源自于程杰的《大话设计模式》这本书,这本书个人感觉很适合我,看着不累,能够安安心心的阅读学习。在这里十分感谢程杰的这本书,我博文中的例子会根据书上的例子来。为了不侵犯这本书的版权,我不会写上具体的代码,仅用自己写的代码截图或者思路描述,毕竟这是给我自己的记录,我写文章是为了在我看完书本后自己尝试描述出来,加深记忆和理解。
从这篇文章起,我将开始自己有章法的学习设计模式,一篇一篇的记录我的学习历程!
本篇博文中用到的设计模式是 抽象工厂模式,用我自己的话概括就是指:某一产品的不同生产形式。
这里,先贴上程序结构图:
从上图可以看出,我定义了两个实体,Department 还有 User,在这里模拟数据库里面的两张表。
现在的情况是:以前我使用Sqlserver数据库来存放数据,应客户需求,将要改成Oracle数据库。
拿User表来当例子,
这里,我定义了一个IUser接口,规定了两个方法,分别是插入一条数据的Insert方法,还有读取一条数据的GetUser方法。
如图中红框显示,我新建了两个类,用来分别执行Oracle的方法还有Sqlserver的方法。
这两个类都实现IUser接口
新建一个DataAccess工厂类,在这个类里面来 利用反射来完成类名的自动调用(不知道这个说法正不正确...)。
上图中的CreateUser方法中,用反射来设置我们预定义的数据库。这里,我将数据库的类型配置放在了web.config里面,这样就可以实现通过修改配置文件来修改使用的数据库,就像访问数据库使用配置文件存放连接字符一样。
1 <appSettings > 2 <!-- 配置使用数据库的类型 --> 3 <add key="db" value="Sqlserver"/> 4 </appSettings>
其实,这里这样写就是实现了用变量来动态的改变方法名,这里通过db这个字符串就可以得到不同“类名”,从而代替了switch case。
到这里,这个程序基本完成,另外在添加上Department的相关类就可以了,这样就实现了切换DB了。
若是我们新增加了一个表(产品),例如Project,那么,我们仅需要新建该表的model,在不同的数据库操作类中添加上对应的操作方法(如:insert()),即可。并不会对其他的产品方法造成任何影响。
若是我们需要添加一个新的数据库,例如Access,那么,我们仅需要新建一个Access操作类,并将db的值修改成Access即可。不用修改客户端代码。
具体关于反射的用法,这里不详说。毕竟是主要撸设计模式的。
最后
我是按照程序编写的过程来写的,可能不会写得很明朗清晰,若是哪里没有写明白,请给我留言,我们来探讨探讨!
另外,谢谢程杰的《大话设计模式》这本优秀的书,对我来说,也许是代码简洁之道的启蒙了!引用该书中的一句话“无痴迷,不成功”