VS中我们都加入了抽象工厂模式,都懂的这种模式可以用来更换数据库。具体应用起来大家都知道应用反射,首先我介绍下我的情况吧。

现在的情况是我的D层程序集和命名空间都为DAL,D层的类也都是以Sql为前缀来命名,例如SqlCancelCardDAL,在工厂中,我的代码时这么写的,大家可以看一下:

[vb] view plaincopy
  1. <span style="font-size:18px;">Imports DFactory
  2. Imports IDAL
  3. Imports System.Reflection
  4. Imports System.Configuration
  5. Public Class DataAccess
  6. Private ReadOnly assemblyName As String = "DAL"
  7. Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DB")
  8. '返回一个IStudent接口
  9. Public Function CheckStuID() As IStudent
  10. Dim ClassName As String = assemblyName + "." + strDB + "StuInfoDAL"
  11. Return CType(Assembly.Load("DAL").CreateInstance(ClassName), IStudent)
  12. End Function
  13. '返回注册接口IRegist
  14. Public Function AboutRegist() As IRegist
  15. Dim ClassName As String = assemblyName + "." + strDB + "RegistDAL"
  16. Return CType(Assembly.Load("DAL").CreateInstance(ClassName), IRegist)
  17. End Function
  18. '返回充值接口ICharge
  19. Public Function InsertInfo() As ICharge
  20. Dim ClassName As String = assemblyName + "." + strDB + "ChargeDAL"
  21. Return CType(Assembly.Load("DAL").CreateInstance(ClassName), ICharge)
  22. End Function
  23. ......
  24. End Class
  25. </span>

App.config中反射为:

[vb] view plaincopy
  1. <add key="DB" value="Sql"/>
  2. 改变为
  3. <add key="DB" value="Oracle"/>

接着想,我们原来的命名空间跟改变的OracleDAO命名空间完全不一样,看一下原来的工厂代码这样写的:

[vb] view plaincopy
  1. Private ReadOnly assemblyName As String = "DAL"

这样就在程序里把命名空间给写死了,但是我们同样可以利用反射的原理将命名空间移动到XML中,不需要打开VS来看,因为我们的运行都是从项目文件中UI层Debug开始的,所以只需在UI\bin\Debug\UI.exe.config中添加一句:

[vb] view plaincopy
  1. <add key="MM" value="OracleDAO"/>

同时在工厂层中将写死的命名空间那句改为:

[vb] view plaincopy
  1. Private ReadOnly assemblyName = System.Configuration.ConfigurationSettings.AppSettings("MM")

最后一步就是:将每个方法中的return句中“DAL”改为assemblyName即为完美。

这样我们的程序如何更改数据库只需在配置文件中更改命名空间和反射中类的前缀即可,这样就充分运用了抽象工厂+反射,实现更换数据库的功能。

如何利用抽象工厂更换数据库相关推荐

  1. 利用抽象工厂创建DAO、利用依赖注入去除客户端对工厂的直接依赖、将有关Article的各种Servlet封装到一个Servlet中(通过BaseServlet进行

    利用抽象工厂创建DAO.利用依赖注入去除客户端对工厂的直接依赖.将有关Article的各种Servlet全部封装到一个Servlet中(通过BaseServlet来进行ArticleServlet方法 ...

  2. 剪不断,理不乱——三层架构之抽象工厂加反射

    三层架构前面已经介绍过了,浅谈三层架构.本篇文章主要介绍三层架构中加入抽象工厂和反射加配置文件.以机房收费系统的登录为例. 首先对机房收费系统进行分层,分为三层表示层,业务逻辑层,数据访问层.为了降低 ...

  3. 浅谈设计模式之单例模式、适配器模式、抽象工厂模式

    带你读懂几种常见的设计模式 第三弹 本文已经是设计模式系列的第三篇文章了,今天来讲讲单例模式.抽象工厂模式和适配器模式. 1.单例模式 单例模式让一个类最多只有一个实例.具体的做法是: 让类的构造方法 ...

  4. 抽象工厂+反射+依赖注入 实现对数据访问层和业务逻辑层的优化

    分层思想的一个核心就是部件化,各个层之间是相互独立的,每一层可以随便抽取换成一个其他语言的版本,但只要与相应的接口吻合就行. 我用的三层架构大致是这样的,基本的三层就不说了,然后分别为业务逻辑层和数据 ...

  5. 设计模式三之抽象工厂模式

    2019独角兽企业重金招聘Python工程师标准>>> 1.引子 关于抽象模式,个人花了很长的时间去理解它.下面还是以连接数据库为列,比如我们有mysql,oralce,sqlser ...

  6. 抽象工厂类--一个简单的例子

    一:利用抽象工厂建造一个加减乘除运算器: 下面是具体的代码实现: Cal抽象方法: package com.hbc.factory;public abstract class Cal {public ...

  7. 【设计模式与Android】抽象工厂模式——嵌合体克隆工厂

    什么是抽象工厂模式 所谓抽象工厂模式,就是为创建一组相关或者是互相依赖的对象提供一个接口,而不需要指定它们的具体类的设计模式.抽象工厂模式适用于一个对象族有相同的约束的情况,用不抽象的语言解释就是国内 ...

  8. 设计模式之 工厂方法模式&&抽象工厂模式

    简单工厂模式的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择动态的实例化相关类,对于客客户端来说是去除了对产品的依赖.但是就是因为这样,每次添加一个新的选择,就要修改工厂类中的switch逻辑 ...

  9. 三层架构之抽象工厂加反射mdash;mdash;实现数据库转换

    在做系统的时候有意识的用到了抽象工厂这个设计模式,主要解决的是数据库更换的问题. 下面就以简单的登录来逐步的分析一下这个模式. 经典的三层架构 数据库如下 1.      一般的数据库连接方式 界面层 ...

最新文章

  1. Scala花括号和圆括号的区别
  2. RenderManager - cssHook - select_all icon render logic
  3. 关于Unity中的本地存储
  4. 小毛thinking:why c# sucks and python rocks
  5. 【数据结构】线性表之链式线性表
  6. c标准语言库里的i o函数,C语言文件I/O和标准I/O函数
  7. SAP 资产分类的配置方法
  8. 一种可以自我修改的计算机器
  9. Nordic nRF52840实战学习--ble_app_blinky例程
  10. 验证OpenVino时,找不到指定模块的解决
  11. 看这个就够了,谷歌翻译Google 退出中国后如何恢复网页翻译?
  12. 给定一个数组,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择某一天买入这只股票,并选择在未来的一个不同的日子卖出该股票。【LeetCode Hot 100】
  13. HTML+CSS静态页面网页设计作业——我的家乡-四川成都(4页) HTML+CSS+JavaScript
  14. uni-app 中如何使用谷歌地图 !?
  15. ThinkPad电脑黑屏只显示鼠标
  16. 零预算?如何免费开发自己的管理系统?
  17. [问题解决]QCA‘s qca-ossl (OpenSSL) plugin is missing
  18. 双足竞走机器人的意义_双足竞走机器人设计1
  19. XXE漏洞介绍及利用
  20. RHEL6/7更新系统的CA

热门文章

  1. 【Android 热修复】热修复原理 ( Dex 文件拷贝后续操作 | 外部存储空间权限申请 | 执行效果验证 | 源码资源 )
  2. 【Qt】Qt 开发桌面程序 ( Qt 版本 5.14.2 | 编辑 Qt 桌面按钮控件 | 修改按钮文本 | 为按钮添加点击事件 | 系统调用 | 去掉系统调用命令窗口 )
  3. 【Android 异步操作】线程池 ( 线程池 reject 拒绝任务 | 线程池 addWorker 添加任务 )
  4. 【组合数学】生成函数 ( 生成函数应用场景 | 使用生成函数求解递推方程 )
  5. 【计算机网络】物理层 : 基本概念 ( 概述 | 概念 | 机械特性 | 电气特性 | 功能特性 | 规程特性 )
  6. 【代码管理】GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
  7. 单例模式 Singleton
  8. 5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结
  9. 通过sort()方法实现升序和降序排列
  10. Git冲突与解决方法【转】