首先,设计模式的文章源自于程杰的《大话设计模式》这本书,这本书个人感觉很适合我,看着不累,能够安安心心的阅读学习。在这里十分感谢程杰的这本书,我博文中的例子会根据书上的例子来。为了不侵犯这本书的版权,我不会写上具体的代码,仅用自己写的代码截图或者思路描述,毕竟这是给我自己的记录,我写文章是为了在我看完书本后自己尝试描述出来,加深记忆和理解。

从这篇文章起,我将开始自己有章法的学习设计模式,一篇一篇的记录我的学习历程!

本篇博文中用到的设计模式是 抽象工厂模式,用我自己的话概括就是指:某一产品的不同生产形式。

这里,先贴上程序结构图:

从上图可以看出,我定义了两个实体,Department 还有 User,在这里模拟数据库里面的两张表。

现在的情况是:以前我使用Sqlserver数据库来存放数据,应客户需求,将要改成Oracle数据库。

拿User表来当例子,

这里,我定义了一个IUser接口,规定了两个方法,分别是插入一条数据的Insert方法,还有读取一条数据的GetUser方法。

如图中红框显示,我新建了两个类,用来分别执行Oracle的方法还有Sqlserver的方法。

这两个类都实现IUser接口

新建一个DataAccess工厂类,在这个类里面来 利用反射来完成类名的自动调用(不知道这个说法正不正确...)。

上图中的CreateUser方法中,用反射来设置我们预定义的数据库。这里,我将数据库的类型配置放在了web.config里面,这样就可以实现通过修改配置文件来修改使用的数据库,就像访问数据库使用配置文件存放连接字符一样。

   <appSettings >
<!-- 配置使用数据库的类型 -->
<add key="db" value="Sqlserver"/>
</appSettings>

其实,这里这样写就是实现了用变量来动态的改变方法名,这里通过db这个字符串就可以得到不同“类名”,从而代替了switch case。

到这里,这个程序基本完成,另外在添加上Department的相关类就可以了,这样就实现了切换DB了。

若是我们新增加了一个表(产品),例如Project,那么,我们仅需要新建该表的model,在不同的数据库操作类中添加上对应的操作方法(如:insert()),即可。并不会对其他的产品方法造成任何影响。

若是我们需要添加一个新的数据库,例如Access,那么,我们仅需要新建一个Access操作类,并将db的值修改成Access即可。不用修改客户端代码。

具体关于反射的用法,这里不详说。毕竟是主要撸设计模式的。

最后

我是按照程序编写的过程来写的,可能不会写得很明朗清晰,若是哪里没有写明白,请给我留言,我们来探讨探讨!

另外,谢谢程杰的《大话设计模式》这本优秀的书,对我来说,也许是代码简洁之道的启蒙了!引用该书中的一句话“无痴迷,不成功”

相关链接:

Demo下载:http://download.csdn.net/detail/a406502972/7890969

反射 + 抽象工厂模式切换DB数据源(附Demo)的更多相关文章

  1. vb.net版机房收费——助你学会七层架构(二)反射+抽象工厂

    上一篇咱们做好了准备工作.数据库设计和Entity层,如今介绍 4.反射+抽象工厂 反射:用来消除Switch和if的,这里我尽量简单地介绍,以便大家理解.反射其有用起来非常easy.你就觉得他就是决 ...

  2. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  3. C# 反射+抽象工厂模式

    此模式可以很好的更换程序使用不同的数据库 1.用到的属性类 using System; using System.Collections.Generic; using System.Linq; usi ...

  4. 就不能换DB吗? 抽象工厂模式

    15.1 就不能换DB吗? 15.2 最基本的数据访问程序 namespace 抽象工厂模式 { class Program { static void Main(string[] args) { U ...

  5. Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...

  6. 抽象工厂模式&简单工厂模式

    抽象工厂模式 优点: 如IFactory factory=new AccessFactory(),在一个应用中只需要初始化一次,这就使得改变应用的时候变得非常容易:其次它让具体的创建实例过程与客户端分 ...

  7. 学习日记之抽象工厂模式和Effective C++

    抽象工厂模式(Abstract Factory):提供一个创建一系列相关或者相互依赖对象的接口.而无需制定他们详细的类. (1),工厂方法模式是定义一个用于创建对象的接口.让子类决定实例化哪一个类. ...

  8. [Python设计模式] 第15章 如何兼容各种DB——抽象工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目 如何让一个程序,可以灵活替换数据库? 基础版本 class User(): ...

  9. 设计模式之抽象工厂模式(附带类似反射功能的实现/c++)

    问题描述 假设我们要开发一款游戏, 当然为了吸引更多的人玩, 游戏难度不能太大(让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单(没有挑战性也不符合玩家的心理).于是我们就可以采用这样一 ...

随机推荐

  1. 给td添加滚动条

    <td><div style="overflow-y:scroll;height:330px;">test</div></td>

  2. 5.Android消息推送机制简单例子

    1.首先布局文件xml代码: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout x ...

  3. bzoj 3262 陌上花开

    本质是一个三维偏序,一位排序后cdq分治,一维在子函数里排序,一维用树状数组维护. 把三维相等的合并到一个里面. #include<iostream> #include<cstdio ...

  4. BZOJ 2946: [Poi2000]公共串

    2946: [Poi2000]公共串 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 342[Submit][Status][D ...

  5. 12.3 Arithmetic-software-

    一.流程图: 二.软件功能: 分为混合模式和单则模式,混合模式生成指定题数的任意四则混合运算,数字是1-10之间随机:单则模式是生成指定题数的加减乘除中指定的某一则运算,数字是1-10之间随机. 用户 ...

  6. NPOI操作Excel时使用列头来读取数据的方法

    首先定义扩展方法: public static ICell GetCell(this IRow row, string clounmName) { IRow firstRow = row.Sheet. ...

  7. 使用U盘重装电脑操作系统

    1. 打开360软件管家,找一个软件"蚂蚁U盘启动"下载,下载好以后打开,电脑上插入U盘,我们制作一个启动U盘备用! 图片图片 按提示制作好启动盘后,保管好U盘. 找一个系统下载网 ...

  8. 好用的开源web系统总结

    1.论坛 phpwind 一个用wind框架写的论坛       discuz 社区动力 论坛   2.商城 Ecshop 商城腾讯的开源商城项目 一款B2C独立网店系统,系统是基于PHP语言及MYS ...

  9. zendstudio快捷键收录

    360截屏快捷键:ctrl+shift+x zendstudio:注释代码:ctrl+shift+/ 删除光标所在行:ctrl+D 复制当前行:ctrl+alt+↓ 上下行互换:alt+↑/↓ 代码格 ...

  10. 2015.4.25-2015.5.1 字符串去重,比例圆设计,中奖机和canvas橡皮擦效果等

    1.字符串去重,html模板取值   2.javascript正则表达式之$1...$9   3.jquery插件   4.返回上一页并刷新 解决方法: <a href ="javas ...