在做系统的时候有意识的用到了抽象工厂这个设计模式,主要解决的是数据库更换的问题。

下面就以简单的登录来逐步的分析一下这个模式。

经典的三层架构

数据库如下

1.      一般的数据库连接方式

界面层

   1:  Public Class Login
   2:      Private Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Click
   3:          Dim LUser As New Entity.User
   4:          Dim BCheck As New BLL.B_Login
   5:          LUser.User_ID = txtName.Text
   6:          LUser.User_Pwd = txtPwd.Text
   7:          If BCheck.Check(LUser) = True Then
   8:              MsgBox("登录成功!")
   9:          Else
  10:              MsgBox(“"登录失败!")
  11:          End If
  12:      End Sub
  13:   
  14:      Private Sub btnCancle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancle.Click
  15:          End
  16:      End Sub
  17:  End Class

业务逻辑层

   1:  Public Class B_Login
   2:      Function Check(ByVal User As Entity.User) As Boolean
   3:          Dim DaUser As New DAL.D_UserInfo
   4:          Dim BlUser As New Entity.User
   5:          Bluser.User_ID=User.ID
   6:          BlUser = DaUser.Check(BlUser)    
   7:            If BlUser.User_Pwd = User.User_Pwd Then
   8:               Return True
   9:           Else
  10:                Return False
  11:           End If
  12:        End Function
  13:  End Class

数据持久层

   1:  Imports System.Data.SqlClient
   2:  Public Class D_UserInfo
   3:  Dim ConnStr As String = "Data Source=******;Initial Catalog=Student;User ID=sa;Password=******"
   4:      Dim conn As SqlConnection = New SqlConnection(ConnStr)
   5:      Function Check(ByVal User As Entity.User) As Entity.User
   6:          Dim sql As String = "select * from UserInfo where UserInfo=" & User.User_ID
   7:          Dim cmd As SqlCommand = New SqlCommand(sql, conn)
   8:          Dim read As SqlDataReader
   9:          Try
  10:              conn.Open()
  11:              read = cmd.ExecuteReader
  12:              User.User_ID = read.Item(0)
  13:              User.User_Pwd = read.Item(1)
  14:              Return User
  15:          Catch ex As Exception
  16:              User.User_Pwd = ""
  17:              Return User
  18:          End Try
  19:      End Function
  20:  End Class

2.      简单工厂

添加一个工厂类和一个接口

接口类

   1:  Public Interface IUserInfo
   2:      Function Check(ByVal IUser As Entity.User) As Entity.User
   3:  End Interface

工厂类

   1:  Imports [Interface]
   2:  Public Class DFactory
   3:      'Dim DataBase As String = "Access"
   4:      Dim DataBase As String = "Sql"
   5:      Function CreateUserInfo() As IUserInfo
   6:          Dim DB As IUserInfo
   7:          Select Case DataBase
   8:              Case "Sql"
   9:                  DB = New D_UserInfoSql
  10:                  'Case "Access"
  11:                  '    DB = New D_UserInfoAccess
  12:          End Select
  13:          Return DB
  14:      End Function
  15:  End Class

当然D_UserInfoSql实现接口,代码基本不变

当有新的数据库使用时候(例如Access数据库)可以将工厂中的注释部分添上,然后重新写Dal层就可以直接使用,但是这样的不足是还是需要再次编译工厂,利用反射可以解决这个问题。

3.抽象工厂加反射

工厂类

   1:  Imports [Interface]
   2:  Imports System.Reflection
   3:  Public Class DFactory
   4:      '抽象工厂加反射
   5:      Dim DBString As String = System.Configuration.ConfigurationSettings.AppSettings("DBString")
   6:      Function CreateUserInfo() As IUserInfo
   7:          Return CType(Assembly.Load("DAL").CreateInstance("DAL.D_UserInfo" & DBString), IUserInfo)
   8:      End Function
   9:  End Class

数据持久层

   1:  Imports System.Data.SqlClient
   2:  Public Class D_UserInfoSql : Implements [Interface].IUserInfo
   3:      'Dim ConnStr As String = "Data Source=******;Initial Catalog=Student;User ID=sa;Password=******"
   4:      Dim ConnStr As String = System.Configuration.ConfigurationSettings.AppSettings("ConnStr")
   5:      Dim conn As SqlConnection = New SqlConnection(ConnStr)
   6:      Public Function Check(ByVal IUser As Entity.User) As Entity.User Implements [Interface].IUserInfo.Check
   7:          Dim sql As String = "select * from UserInfo where UserInfo=" & IUser.User_ID
   8:          Dim cmd As SqlCommand = New SqlCommand(sql, conn)
   9:          Dim read As SqlDataReader
  10:          Try
  11:              conn.Open()
  12:              read = cmd.ExecuteReader
  13:              IUser.User_ID = read.Item(0)
  14:              IUser.User_Pwd = read.Item(1)
  15:              Return IUser
  16:          Catch ex As Exception
  17:              IUser.User_Pwd = ""
  18:              Return IUser
  19:          End Try
  20:      End Function
  21:  End Class

配置文件

   1:    <appSettings>
   2:      <add key="ConnStr" value ="Data Source=******;Initial Catalog=Student;User ID=sa;Password=******"></add>
   3:      <add key="DBString" value ="Sql"></add>
   4:    </appSettings>

添加两个Key,一个是连接数据库的字符串,一个是通过反射来产生不同数据库的Dal层的

这样一来就可以实现设计模式中的“开闭原则”,如果更换数据库只需要增加类(DAL),而不需要更改,更不需要重新编译。

PS:配置文件必须在界面层

1、         反射的写法:

objType=Assembly.Load(AssemblyPath).CreateInstance(className);其中:AssemblyPath指程序集名。className指命名空间.类名称。

2、         反射的一个原则:一切皆以UI层的bin文件夹中的dll名称为中心。(原因很简单:.net类加载的机制就是默认从本程序集的bin文件中找,所以bin文件夹中一定要有要加载的程序集的dll)。UI层中bin文件夹中dll叫什么名字AssemblyPath就使用什么名字,bin内部类的全名叫什么,className就写成什么全名。.net中的引用:加入对某个程序集的引用就能在程序集有变化时自动拷贝dll。

转载于:https://www.cnblogs.com/beijiguangyong/archive/2011/03/25/2302780.html

三层架构之抽象工厂加反射mdash;mdash;实现数据库转换相关推荐

  1. 《三层架构之抽象工厂加反射》纠错

    每当别人问我关于三层的知识的时候我总是推荐自己的<三层架构之抽象工厂加反射>这篇博客.这篇博客是自己当时学习三层的时候写的一个简单的登录例子.这个例子通过登录这个用例简单的介绍了三层,然后 ...

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

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

  3. 三层之抽象工厂加反射实例

    C#版的三层登陆实例,只是为了学习三层而实现的.为了接下来需要进行的vb.net版机房收费系统.根据上次的C#改编的vb.net版本登陆实例.不过在验收的时候发现了很多问题,所以进行了修改. 花费好几 ...

  4. 机房重构 之 抽象工厂+反射+配置文件 实现数据库訪问

    重构机房已经開始三个多星期了,从刚開始的一头雾水,到如今的柳暗花明,由開始的无从下手,到如今感觉犹 如脱胎换骨了般.和两个星期前相比.如今明朗了多了,心情也好了不少. 先给大家看一下这次重构的总体架构 ...

  5. 简单工厂、工厂方法、抽象工厂、抽象工厂加简单工厂

    简单工厂模式:简单工模式时类的创建模式,又叫做静态工厂方法(static Factory Method).简单工厂模式是一个工厂对象决定创建出哪一种产品类的实例.它存在的目的很简单:定义一个创建对象的 ...

  6. 简单工厂模式,抽象工厂模式,反射工厂模式的代码总结

    工厂模式也用了不少,特别是MS的petshop中对数据库的访问,通过工厂模式可以达到自由切换SQL 和 Oracle 数据库.近来也在看设计模式的书,发现工厂模式还是有不少的扩展.结合书中的知识和我自 ...

  7. 工厂模式 + 反射 ?= 灵活多变的数据库

    工厂模式 + 反射 ?= 灵活多变的数据库么 由于现实项目中我们难保会客户会更换系统的数据库,这样我们需要把若干数据库各种情况基本上都想到.多种数据库,引出抽象,我们就能在众多数据库的上层抽出一个Fa ...

  8. 课程设计-三层架构ASP.NET作品分享网站(sql server数据库)

    1.主要功能: 前台:首页展现首页推荐的作品和精彩活动,图集页面可以进行搜索,作品以瀑布流的显示展现,有返回顶部的功能.登录以后可以报名活动发表自己的作品,还可以评论作品. 后台:管理作品,管理活动, ...

  9. C# 三层级架构问题之 能加载文件或程序集或它的某一个依赖项。系统找不到指定的文件

    用抽象工厂加反射来确定调用哪一个D层的时候,出现了错误"未能加载文件或程序集或它的某一个依赖项.系统找不到指定的文件" 如下图所示: 出现这种错误有两种情况: 1.      DL ...

最新文章

  1. Mac JDK和SDK环境变量配置
  2. vim改变与选择字休大小的方法
  3. Spark性能相关参数配置详解
  4. ICPC网络赛第二场G Limit
  5. 一篇文章带你弄懂大数据!
  6. 【BZOJ2221】面试的考验,随机数列+线段树+离线
  7. php gdb strace抓包,gdb,strace那些不常用的功能
  8. JS中的THIS处理及正则表达式 — 1、callapplyjson
  9. 请慎用ASP.Net的validateRequest=false属性
  10. Redis中的Scan命令的使用
  11. html泰勒展开,常见的泰勒公式展开式大全
  12. keras实现回归预测
  13. python3 selenium模块Chrome设置代理ip的实现
  14. Ubuntu 18.04 从零开始安装显卡驱动、配置MMDetection3D环境
  15. 网心科技打造全球首个百万量级节点的边缘云计算网络“星域云”
  16. 关于RegisterClass的注册位置
  17. MIPS指令集 指令的格式
  18. 集电极开路,漏极开路
  19. c8051f120相关
  20. 《kafka中文手册》- 构架设计(二)

热门文章

  1. ftp 200 227 451linux,FTP无法链接
  2. oracle xtts 测试,XTTS 跨平台表空间迁移测试
  3. mysql inno_mysql inno优化配置方法
  4. 电缆沟巡查机器人_电缆沟道巡检机器人的制作方法
  5. 错误: 找不到符号_Excel函数常见特殊符号、字符解读
  6. python安装后使用_Python安装后如何使用?
  7. rollback 最后判断成功_最后4天!这些你知道吗?
  8. 一起来看React(路由跳转)
  9. 部署ftp文件共享服务
  10. 《微信生活白皮书》发布微信用户数据