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

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

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

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

从上图可以看出,我定义了两个实体,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. 关于svg格式图片颜色更改

    利用 style="fill:#8a8acb" 放在path标签下面. 技巧:比如一个svg是一个圆圈内包含一个问号,问号内填充白色,圆圈内,问号外,填充其他颜色,如蓝色.可 设置 ...

  2. windows2003安装证书服务:csp配置不正确、您没有此密钥容器的写访问权限

    1.填写CA名称后在生成密钥时提示:csp配置不正确或安装不完整.      原因:可能的原因为CS服务(Crysptographic Service)没有启动 . ps:该服务依赖RPC服务,但RP ...

  3. [转载]抓包,端口镜像,monitor session命令(转)

    原文地址:抓包,端口镜像,monitor session命令(转)作者:浮云皓月 一.SPAN简介 SPAN技术主要是用来监控交换机上的数据流,大体分为两种类型,本地SPAN和远程SPAN. --Lo ...

  4. 构建兼容浏览器的Angularjs web应用

    背景 随着mvvm逐渐成熟,现在使用jQuery构建web应用已经显得过时了,而且使用jQuery需要编写更多的代码去控制dom的取值.赋值.绑定事件等,而mvv从底层实现了对以上操作的支持,让程序员 ...

  5. angularjs 中state.go 跳转并且打开新的浏览器窗口

    包子最近遇到业务人员提的非常无厘头的需求,就是调页面的时候,一定要打开一个新的浏览器窗口...>o<奇葩!!! 但是我的页面都是state.go跳转的呀,我各种百度,发现,貌似state, ...

  6. XHTML的规则

    以正确的DOCTYPE和命名空间开始文档 使用meta内容元素声明你的字符编码 用小写字母写所有元素和属性名称 给所有属性值加引号 给所有属性赋一个值 关闭所有标签 用空格和斜杠关闭“空”标签 不要在 ...

  7. css 强制 中文、英文 换行

    .livechat-text a { display: block; word-break:break-all; /* 英文换行 */ white-space:normal; /* 中文换行 */ } ...

  8. 【强烈推荐】利用NAT、Host-Only双虚拟网卡,实现Virtual Box中CentOS6.3联网

    问题背景: 先前都是在Virtual Box中以“网络共享”方式,让里面的Linux虚拟机Host-Only方式联网,参考如下: Virtual Box下配置Host-Only联网方式详解 但最近被公 ...

  9. /etc/rc.d/rc与/etc/rc.d/init.d的关系

    在这里先解释一下 /etc/rc.d/init.d 里面放的都是什么东西.这个目录存放的是一些脚本,一般是Linux以rpm包安装时设定的一些服务的启动/关闭脚本.系统在安装时装了好多rpm包,这里面 ...

  10. html用户注册界面

    html用户注册界面   先上一张简约的界面的效果图 这里是style里面的内容 <style> input[type]{ border: 1px solid darkorange; ba ...