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

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

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

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

从上图可以看出,我定义了两个实体,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. 解决:Windows 开机弹出AotuIt ERROR 错误

    AutoIt是个脚本语言,常被用于自动化安装.网络上有些系统镜像里含有AutoIt脚本,用于系统的自动配置.出现这种问题往往有两种可能的原因: 1)做系统的时候没搞好.这种情况就需要换一个镜像文件. ...

  2. 红米3 TWRP-3.0.2(android_6.0.1_r72分支)中文版Recovery更新于20161018

    TWRP3.0.2更新简介 TWRP是TeamWin团队https://github.com/TeamWin/Team-Win-Recovery-Project的开源项目,也是Omnirom系统默认的 ...

  3. 上传本地代码到github

    第一步:建立git仓库 cd到你的本地项目根目录下,执行git命令git init第二步:将项目的所有文件添加到仓库中git add .如果想添加某个特定的文件,只需把.换成特定的文件名即可第三步:将 ...

  4. Xcode真机测试could not find developer disk image解决方法

    原文地址:http://my.oschina.net/u/2340880/blog/521700 Xcode真机测试could not find developer disk image解决方法 在使 ...

  5. Bzoj1176 [Balkan2007]Mokia

    Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2000  Solved: 890 Description 维护一个W*W的矩阵,初始值均为S.每次操作 ...

  6. bzoj2228[ZJOI2011]礼物(gift)

    据说联赛之前写题解可以涨RP 这题的输入格式半天没看懂-其实是有q层摞在一起,每一层大小都是p*r,依次输入q层的情况.那么首先我们枚举三种挖方块的姿势,分别使切出的方块的上面/前面/右面是正方形的面 ...

  7. mysql-data-dumper

    mysql-data-dumper mysql-data-dumper最近几天写的项目. 一开始仅仅想实现一个简单的数据导出工具,方便大家使用,提升团队成员的效率.后来结果想法天马行空,所以进度有点慢 ...

  8. java 随机数 优惠码 生成 随机字串

    package test; import java.util.HashSet; import java.util.Random; import java.util.Set; public class ...

  9. Angular.js通过bootstrap实现经典的表单提交

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel= ...

  10. 纯js+css实现loading等待效果

    此插件是基于jqueryUI的widget,下面是具体实现代码 第一部分css: /***loading***/ .loading-box{ position:absolute; text-align ...