抽象工厂模式定义:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。
好处:经常用层数据层,便于更换数据库产品,灵活性强,让具体的创建实例过程和客户端分离。
反射技术:提供了封装程序集、模块和类型的对象。可以使用反射动态地创建类型的实例,将类型绑定到现有对 象,或从现有对象中获取类型。
语法格式:Assembly.load("程序集名称").CreatInstance("命名空间 .类名称")
基础介绍完毕,下面逐步认识实例中的应用:
抽象工厂类代码:
好处:经常用层数据层,便于更换数据库产品,灵活性强,让具体的创建实例过程和客户端分离。
反射技术:提供了封装程序集、模块和类型的对象。可以使用反射动态地创建类型的实例,将类型绑定到现有对 象,或从现有对象中获取类型。
语法格式:Assembly.load("程序集名称").CreatInstance("命名空间 .类名称")
基础介绍完毕,下面逐步认识实例中的应用:
程序采用三层架构,利用抽象工厂实现了DAL和BLL分离,这是包图:
DAL数据层:
IDAL层和DAL层的关系:
工厂层关系:
代码实现:
BLL层方法:
''' <summary>
''' 增加用户
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>返回不同的情况</returns>
''' <remarks>不同情况代表不同的数值</remarks>
Function AddUserInfo(ByVal userInfo As UserInfo) As Integer
Dim iUser As IDAL.IUser
Dim intAdd As Integer
Dim btnAdd As Boolean
Dim dsSelect As New DataSet
'调用抽象工厂实例化数据表
Dim dataAccess As New DataAccess
iUser = dataAccess.CreateUser
'调用数据接口层的函数 查询是否存在用户
dsSelect = iUser.QueryUser(userInfo)
If Not dsSelect.Tables(0).Rows.Count = 0 Then
intAdd = 0 '用户名已经存在,不能重复注册
Return intAdd
Exit Function
Else
' 用户名不存在,可以添加
btnAdd = iUser.AddUser(userInfo)
If btnAdd = True Then
intAdd = 1 '添加成功
Else
intAdd = 2 '出现故障
End If
Return intAdd
End If
End Function
抽象工厂类代码:
'******类名:DataAccess
'******创建人:Jesse
'******创建时间:2012年5月4日
'******说明:用抽象工厂实现数据接口层,用到反射+配置文件
Option Explicit On
Option Strict On
Imports IDAL
Imports System.Reflection '引入反射
Imports System.Configuration '引入配置文件管理
''' <summary>
''' 简单工厂优化的抽象工厂方法
''' </summary>
''' <remarks></remarks>
Public Class DataAccess
Private Shared ReadOnly AssemblyName As String = "DAL" '数据程序集名称
Private Shared ReadOnly db As String = ConfigurationManager.AppSettings("DB") '读取配置文件
''' <summary>
''' 实例产生User表
''' </summary>
''' <returns>User表</returns>
''' <remarks></remarks>
Public Function CreateUser() As IDAL.IUser
Dim ClassName As String = "DAL" + "." + db + "User" '要实例化的类名
Dim User As IUser '定义接口
User = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IUser) '反射实例化
Return User
End Function
''' <summary>
''' 实例用户基本信息表
''' </summary>
''' <returns>基本信息表</returns>
''' <remarks></remarks>
Public Function CreateStudentInfo() As IStudentInfo
Dim ClassName As String = "DAL" + "." + db + "StudentInfo"
Dim StudentInfo As IStudentInfo
StudentInfo = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IStudentInfo) '反射实例化
Return StudentInfo
End Function
''' <summary>
''' 实例充值表
''' </summary>
''' <returns>充值表</returns>
''' <remarks></remarks>
Public Function CreateRecharge() As IRecharge
Dim ClassName As String = "DAL" + "." + db + "Recharge"
Dim Recharge As IRecharge
Recharge = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IRecharge) '反射实例化
Return Recharge
End Function
''' <summary>
''' 实例化退卡信息表
''' </summary>
''' <returns>退卡信息表</returns>
''' <remarks></remarks>
Public Function CreateCancelCard() As ICancelCard
Dim ClassName As String = "DAL" + "." + db + "CancelCard"
Dim CancelCard As ICancelCard
CancelCard = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), ICancelCard) '反射实例化
Return CancelCard
End Function
''' <summary>
''' 实例化上机记录表
''' </summary>
''' <returns>上机记录表</returns>
''' <remarks></remarks>
Public Function CreateOnlineRcd() As IOnlineRcd
Dim ClassName As String = "DAL" + "." + db + "OnlineRcd"
Dim OnlineRcd As IOnlineRcd
OnlineRcd = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IOnlineRcd) '反射实例化
Return OnlineRcd
End Function
''' <summary>
''' 实例化基本数据设定
''' </summary>
''' <returns>基本数据设定</returns>
''' <remarks></remarks>
Public Function CreateBasicData() As IDAL.IBasicData
Dim ClassName As String = "DAL" + "." + db + "BasicData"
Dim BasicData As IBasicData
BasicData = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IBasicData) '反射实例化
Return BasicData
End Function
''' <summary>
''' 工作记录表
''' </summary>
''' <returns>工作记录表</returns>
''' <remarks></remarks>
Public Function CreateWorklog() As IDAL.IWorklog
Dim ClassName As String = "DAL" + "." + db + "Worklog"
Dim Worklog As IWorklog
Worklog = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IWorklog) '反射实例化
Return Worklog
End Function
''' <summary>
''' 日结账单表
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Function CreateBillOfDay() As IBillOfDay
Dim ClassName As String = "DAL" + "." + db + "BillOfDay"
Dim BillOfDay As IBillOfDay
BillOfDay = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IBillOfDay) '反射实例化
Return BillOfDay
End Function
End Class
IDAL层IUser:
'******类名:IUser
'******创建人:毕桃杨
'******创建时间:2012年5月4日
'******说明:数据表User的接口类
''' <summary>
''' User数据表接口
''' </summary>
''' <remarks></remarks>
'''
Public Interface IUser
''' <summary>
''' 查询用户
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>返回记录集</returns>
''' <remarks></remarks>
Function SelcetUser(ByVal userInfo As Entity.UserInfo) As DataSet
''' <summary>
''' 修改密码
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>是否修改成功</returns>
''' <remarks></remarks>
Function ModifyPwd(ByVal userInfo As Entity.UserInfo) As Boolean
''' <summary>
''' 添加用户
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>是否添加成功</returns>
''' <remarks></remarks>
Function AddUser(ByVal userInfo As Entity.UserInfo) As Boolean
''' <summary>
''' 删除用户
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>是否删除成功</returns>
''' <remarks></remarks>
Function DeleteUser(ByVal userInfo As Entity.UserInfo) As Boolean
''' <summary>
''' 根据用户等级查询用户
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>返回记录集</returns>
''' <remarks></remarks>
Function SelectLevel(ByVal userInfo As Entity.UserInfo) As DataSet
''' <summary>
''' 只是根据用户名查询用户信息
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>返回记录集</returns>
''' <remarks></remarks>
Function QueryUser(ByVal userInfo As Entity.UserInfo) As DataSet
End Interface
DAL层IUser实现类:
'******类名:SqlUser
'******创建人:毕桃杨
'******创建时间:2012年5月6日
'****** 说明:数据表SqlUser的操作类
Option Explicit On
Option Strict On
Imports System.Data '引用类库
Imports System.Data.SqlClient
Imports IDAL
Imports Entity
''' <summary>
''' DAL—User操作类
''' </summary>
''' <remarks></remarks>
Public Class SqlUser
Implements IDAL.IUser '实现I_user接口
''' <summary>
''' 添加用户
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>返回是否添加用户成功</returns>
''' <remarks></remarks>
Public Function AddUser(ByVal userInfo As Entity.UserInfo) As Boolean Implements IDAL.IUser.AddUser
Dim btn As Boolean = False '是否成功标志
Dim sqlHelper As New SQLHelper() '助手类
Dim strSQL As String 'SQL字符串
Dim i As Integer '受影响的行数
'参数集合
Dim paras As SqlParameter()
paras = New SqlParameter() {New SqlParameter("@userID", userInfo.userID),
New SqlParameter("@u_password", userInfo.u_password),
New SqlParameter("@u_level", userInfo.u_level),
New SqlParameter("@u_operator", userInfo.u_operator)
}
'SQL语句
strSQL = "insert into D_sqlUser (userID,u_password,u_level,u_operator)" _
& "values(@userID,@u_password,@u_level,@u_operator)"
'执行带参数的过程
i = sqlHelper.ExecuteNonQuery(strSQL, paras, CommandType.Text)
If i > 0 Then
btn = True
End If
Return btn
End Function
''' <summary>
''' 删除用户
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>是否删除成功</returns>
''' <remarks></remarks>
Public Function DeleteUser(ByVal userInfo As Entity.UserInfo) As Boolean Implements IDAL.IUser.DeleteUser
Dim strSQL As String 'sql字符串
Dim i As Integer '受影响的行数
Dim btn As Boolean = False '是否成功标志
Dim sqlHelper As New SQLHelper 'SQL助手类
Dim strUserId As String '用户名
strUserId = userInfo.userID '获取实体类的用户名
'删除用户sql语句
strSQL = "delete from D_sqlStudentInfo where userID ='" & Trim(strUserId) & "'"
i = sqlHelper.ExecuteNonQuery(strSQL, CommandType.Text)
If i > 0 Then
btn = True '成功
End If
Return btn
End Function
''' <summary>
''' sql实现查询用户
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>返回记录集</returns>
''' <remarks></remarks>
Public Function SelcetUser(ByVal userInfo As Entity.UserInfo) As System.Data.DataSet Implements IDAL.IUser.SelcetUser
Dim strUserID As String '用户名存储
Dim strPWD As String '用户密码存储
Dim queryString As String 'SQL查询语句
Dim sqlHelper As SQLHelper = New SQLHelper()
'从实体类获取用户名和密码
strUserID = userInfo.userID
strPWD = userInfo.u_password
'查询SQL语句
queryString = "SELECT * FROM D_sqlUser WHERE userID ='" & Trim(strUserID) & "'" & "AND u_password ='" & strPWD & "'"
Dim dtUser As DataSet
'执行不带参数的查询过程
'dtUser = sqlHelper.Query(queryString)
dtUser = sqlHelper.ExecuteQuery(queryString, CommandType.Text)
Return dtUser
End Function
''' <summary>
''' 修改密码
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>返回是否修改成功</returns>
''' <remarks></remarks>
Public Function ModifyPwd(ByVal userInfo As Entity.UserInfo) As Boolean Implements IDAL.IUser.ModifyPwd
Dim btn As Boolean = False '是否修改成功判断
Dim sqlHelper As New SQLHelper()
Dim strSQL As String 'SQL语句
Dim i As Integer '受影响的行数
'参数集合
Dim paras As SqlParameter()
paras = New SqlParameter() {New SqlParameter("@userID", userInfo.userID),
New SqlParameter("@u_password", userInfo.u_password)
}
'SQL查询语句
strSQL = "update D_sqlUser set u_password=@u_password where userid=@userID"
i = sqlHelper.ExecuteNonQuery(strSQL, paras, CommandType.Text) '执行带参数的查询过程
If i > 0 Then
btn = True '修改成功
End If
Return btn
End Function
''' <summary>
''' 根据用户等级查询信息
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>返回记录集</returns>
''' <remarks></remarks>
Public Function SelectLevel(ByVal userInfo As Entity.UserInfo) As System.Data.DataSet Implements IDAL.IUser.SelectLevel
Dim strLevel As String '获取用户等级
Dim sqlHelper As New SQLHelper
Dim queryString As String 'SQL语句
Dim dsUser As New DataSet '定义记录集
'从实体类获得等级
strLevel = Trim(userInfo.u_level)
'查询SQL语句
queryString = "SELECT * FROM D_sqlUser WHERE u_level ='" & Trim(strLevel) & "'"
''执行不带参数的查询过程
dsUser = sqlHelper.ExecuteQuery(queryString, CommandType.Text)
Return dsUser
End Function
''' <summary>
''' DAL 查询用户只是根据用户名查询
''' </summary>
''' <param name="userInfo">实体类</param>
''' <returns>返回记录集</returns>
''' <remarks></remarks>
Public Function QueryUser(ByVal userInfo As Entity.UserInfo) As System.Data.DataSet Implements IDAL.IUser.QueryUser
Dim strUserID As String '用户名
Dim strPWD As String '密码
Dim sqlHelper As New SQLHelper '助手类
Dim queryString As String 'SQL查询语句
'从实体类获取数据
strUserID = userInfo.userID
strPWD = userInfo.u_password
'SQL查询语句
queryString = "SELECT * FROM D_sqlUser WHERE userID ='" & Trim(strUserID) & "'"
'执行不带参数的查询过程
Dim dsUser As DataSet
dsUser = sqlHelper.ExecuteQuery(queryString, CommandType.Text)
Return dsUser
End Function
End Class
总结:BLL层无需知道DAL层,IDAL接口层实现了数据层和逻辑层的分离,用反射更是减少了分支判断带来的耦合。