反射 + 抽象工厂模式切换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即可。不用修改客户端代码。
具体关于反射的用法,这里不详说。毕竟是主要撸设计模式的。
最后
我是按照程序编写的过程来写的,可能不会写得很明朗清晰,若是哪里没有写明白,请给我留言,我们来探讨探讨!
另外,谢谢程杰的《大话设计模式》这本优秀的书,对我来说,也许是代码简洁之道的启蒙了!引用该书中的一句话“无痴迷,不成功”
相关链接:
作者:Li keli
出处:https://www.cnblogs.com/likeli/p/3964818.html
本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?