谈一谈:抽象工厂+反射+配置文件 实现数据访问程序

原创 2015年11月18日 19:23:37

  《大话设计模式》中第15章中《就不能不换DB吗?》引出了我今天要谈论的主题:抽象工厂+反射+配置文件 实现数据访问程序。当时也不甚理解啊!到了机房收费的亲身实践中,终于体会到了这对组合的奥秘。


抽象工厂模式(Abstract Factory)

提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。知道它是用来创建工厂的就OK了。

反射

提供了封装程序集、模块和类型的对象。这里仅仅用到反射的一部分功能。且记住它的格式:  

Assembly.Load(“程序集名称” CreateInstance(“命名空间 类名称”)

配置文件 

存在于UI层,名字为App.config ,在程序打包发布后,仍可以从安装包中找到该文件并加以更改。(其它不再赘述)


按照大鸟的思路,这种组合写法就能够方便的更改DB,在程序需要更改数据库时不需要重新返工,只需要从配置文件中,把数据库的名字更改一下就Ok了。我把大鸟的思路写一下。(《大话》中的代码是用C#语言写的,而我是在vb.net 版的机房收费系统中理顺思路的,所以以下代码均为vb.net 代码,大同小异)

Factory 中 DataAccess类

  1. <span style="font-size:18px;">Imports System.Configuration    '添加对配置文件的引用,配置文件命名空间    
  2. Imports System.Reflection       '添加对反射的引用   
  3. Public Class DataAccess  
  4.     '通过配置文件获取D层程序集的名称和命名空间的名称(一般情况下相同):DAL    
  5.     Dim AssemblyName As String = System.Configuration.ConfigurationManager.AppSettings("assName")  
  6.     '数据库类型为:Sqlserver    
  7.     Dim db As String = System.Configuration.ConfigurationManager.AppSettings("DB")  
  8.     '创建D层类SqlUserInfoDAL的实例    
  9.     Public Function CreateUserInfo() As IDAL.IUserInfo  
  10.         Dim dalUserInfoName As String = AssemblyName & "." & db & "UserInfoDAL"        '声明要实例化的D层类的名称    
  11.         Return CType(Assembly.Load(AssemblyName).CreateInstance(dalUserInfoName), IUserInfo)  
  12.     End Function  
  13. End Class</span>  
配置文件中添加

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">      <appSettings>   
  2.           <add key ="assName" value ="DAL"/>  
  3.           <add key ="DB" value ="Sqlserver"/>  
  4.       </appSettings></span>  

        如果需要更改数据库比如说要把Sqlserver 更改为Access即可 (这就要求我们在D层建类时,严格命名,把Sql里的类名前面应该是Sqlserver开头,Access数据库时类名应该用Access开头。)如下图:



但是我在敲这一部分时,是这样写的(最初的最初,我没有想着要给系统更换数据库,所以某些变量和方法命名时没有考虑把数据库的选择表达出来)

Factory 中 DataAccess类

  1. <span style="font-size:18px;">Imports System.Reflection    '添加对反射的引用  
  2. Imports System.Configuration  '添加对配置文件的引用  
  3. Public Class DataAccess  
  4.     Dim strDALName As String = System.Configuration.ConfigurationSettings.AppSettings("DALName")  '定义一个字符串strDALName,通过配置文件获取D层程序集的名称和命名空间的名称(一般情况下相同)并赋值给所声明的变量strDALName  
  5.   
  6.     ' 创建一个用户User接口,并把对应的类名称关联上  
  7.     Public Function CreateIUser() As IDAL.IUser  
  8.         '通过配置文件和反射,实例化接口并能够通过更改配置文件的内容更改 实例化D层的程序集和命名空间下的类  
  9.         Return CType(Assembly.Load(strDALName).CreateInstance(strDALName + "." + "UserDAL"), IDAL.IUser)  
  10.     End Function  
  11.     ' 创建一个学生信息StudentInfo接口,并把对应类名称关联上  
  12.     Function CreateIStudent() As IDAL.IStudentInfo  
  13.         Return CType(Assembly.Load(strDALName).CreateInstance(strDALName + "." + "StudentInfoDAL"), IDAL.IStudentInfo)  
  14.     End Function  
  15. End Class</span>  

配置文件中这样写的

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;"><?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.       
  4.       <configSections>  
  5.       </configSections>  
  6.       <connectionStrings>  
  7.             <add name="UI.My.MySettings.MyChargeSystemConnectionString" connectionString="Data Source=(local);Initial Catalog=MyChargeSystem;User ID=sa;Password=123456"  
  8.                   providerName="System.Data.SqlClient" />  
  9.       </connectionStrings>  
  10.       <appSettings>   
  11.           <add key="strConnection" value="Server=bao;DataBase=MyChargeSystem;User ID=sa;Password=123456"  />  
  12.           <add key ="DALName" value ="SqlServerDAL"/>    
  13.       </appSettings>  
  14.           
  15.       <startup>    
  16.       <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />  
  17.       
  18.     </startup>  
  19.   
  20. </configuration></span>  

        大家只要关注:<add key ="DALName" value ="SqlServerDAL"/>  这一行就可以了,把配置文件全部内容贴出来只是让大家了解配置文件内容的全貌。

        考虑到以后可能更换数据库,例如,日后我需要把现在所用的sqlserver 数据库更换为Access,我们只需要重新添加一个程序集即可。例如把该程序集命名为AccessDAL,紧接着,配置文件中把

<add key ="DALName" value ="SqlServerDAL"/>

更改为

<add key ="DALName" value ="AccessDAL"/> 


        然后在里面添加其他类,类名和里面的方法还应用SqlServer 数据库时的类名和方法就可以了,而不需要更改程序的其他程序集(其他的层)。见下图


小结

        不管黑猫白猫,逮住老鼠就是好猫。解决问题的方法往往不局限于一种,我相信抽象工厂+反射+配置文件 这个组合不仅仅能更换一个数据库,还能解决其他的一些问题。这都需要我们对写程序有一种钻研和痴迷的精神,就像小菜最后说的:无痴迷,不成功。相信大家经过不懈的努力,都会成为优秀的程序员。

版权声明:本文为博主原创文章,未经博主允许不得转载。

抽象工厂+反射+配置文件 实现数据访问程序

《大话设计模式》中第15章中《就不能不换DB吗?》引出了我今天要谈论的主题:抽象工厂+反射+配置文件 实现数据访问程序。当时也不甚理解啊!到了机房收费的亲身实践中,终于体会到了这对组合的奥秘。 抽...
  • haovip123
  • haovip123
  • 2014年08月22日 19:25
  • 3477

对抽象工厂+反射+配置文件的实例理解

第一遍学习设计模式时,总有飘飘然的感觉.《大话设计模式》这本书虽然读起来挺有趣味,也感觉比其他讲设计模式的书好理解一些。但是真要用在机房收费系统时还是费劲的。米老师讲过:思想要上移,行动要下移。这两点...
  • wangyajin333
  • wangyajin333
  • 2013年11月27日 21:44
  • 2059

抽象工厂+反射+配置文件

配置文件如下: 首先需要在命名空间里引用: Imports System.Configuration  ‘引用配置文件 Imports System.Reflection         ’...
  • wrs120
  • wrs120
  • 2017年03月12日 21:15
  • 281

三层加抽象工厂加反射加配置文件加SqlHelper

三层的例子敲的差不多了,为了对抽象工厂有个更好的理解,开始对三层进行加工,下面来对三层进行逐步更新,首先是看一下我画的包图:                             包图为大家从宏观...
  • wangdan199112
  • wangdan199112
  • 2014年04月04日 17:40
  • 1590

设计模式学习之抽象工厂模式(实现数据访问层)

1 什么是抽象工厂模式 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们的具体类。结构图如下:   分析一下抽象工厂模式,1提供一系列...
  • wziyx513225244
  • wziyx513225244
  • 2011年08月03日 09:56
  • 3133

结合Java反射用简单工厂模式改进抽象工厂模式

前一篇简单介绍了抽象工厂模式,结合Java的反射机制,可以用简单工厂模式来改进抽象工厂模式,减少类的数量,增加可维护性。UML图如下: 去除IFactory、SqlserverFacto...
  • sdauzxl
  • sdauzxl
  • 2016年08月20日 12:01
  • 1014

如何应对数据库更换(三层架构+抽象工厂+反射+配置文件)

引言在项目开发中,数据库的更换是需要考虑的问题,不同的数据库有着不同的访问方式,不同的SQL语法。恐怕最让人头疼的是项目开发完了,用户提出了更换数据库的要求,修改并不是一件容易的事儿。那么如何应对修改...
  • u013201439
  • u013201439
  • 2016年04月16日 20:57
  • 1333

用反射+配置文件实现数据访问程序

抽象工厂: 在程序的代码中写明要实例化哪一个数据库,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.   反射: 它的格式为: Assembly,Load("程序集名称"...
  • lnazj
  • lnazj
  • 2017年02月09日 14:43
  • 233

简单工厂模式+反射来改进抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类 用抽象工厂模式来实现数据库访问访问程序作为例子 UML图形 产品抽象类:产品有可能有许多不同的实现 具体...
  • lypf19900912
  • lypf19900912
  • 2013年03月17日 09:54
  • 4148

C#实战反射、事件、抽象工厂、发布订阅模式

最近一直在做一个新系统,其中小部分任务需要用到事件监听触发的过程。自己先练练手。 首先是,Listener的代码,监听者监听到事件后需要作出的反应。 namespace ConsoleApplic...
  • shenmegui_zyf
  • shenmegui_zyf
  • 2017年12月06日 16:33
  • 38
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谈一谈:抽象工厂+反射+配置文件 实现数据访问程序
举报原因:
原因补充:

(最多只允许输入30个字)