抽象工厂+反射 实例讲解

    抽象工厂模式定义:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。
    好处:经常用层数据层,便于更换数据库产品,灵活性强,让具体的创建实例过程和客户端分离。

    反射技术:提供了封装程序集、模块和类型的对象。可以使用反射动态地创建类型的实例,将类型绑定到现有对     象,或从现有对象中获取类型。
    语法格式: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接口层实现了数据层和逻辑层的分离,用反射更是减少了分支判断带来的耦合。



  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值