思想上移,行动下移——抽象工厂+反射+配置文件

  从网上查找资料的时候发现很多同学都写过这篇博客了,可见我的方向没有跑偏。虽然我们学设计模式的时候已经接触过抽象工厂模式,大话设计模式中每个设计模式都紧密联系生活,而且主人公讲的也相当有趣,但是真正运用起来却没那么简单。可以说小菜只是帮我们理解了各个设计模式的用途以及优缺点,真正的理解还需要我们自己动手实践。

  为什么要用抽象工厂?

  主要就是为了提高软件的灵活性,运用抽象工厂+反射+配置文件可以很方便的更换数据库。引入接口之后,就可以对外提供一致的接口,而我们既可以用SQLServer实现接口,也可以用AccessDAL实现,能够更好地为B层和D层解耦合。

  

  怎样用于抽象工厂呢?

  我们就以机房收费系统用户登录为例,讲解如何具体运用:

  这里我们用的是SQLServer数据库,配置文件如下:

  

<span style="font-family:KaiTi_GB2312;font-size:18px;">  <appSettings>
    <add key ="DB" value="Sqlserver"/>
    <add key="ConnStr" value="server=.;database=JFSF_Recharge;User ID=sa;Password=123456"/>
  </appSettings></span>
    U层负责接收和输出数据信息,通过B层的返回值显示用户是否登陆成功。

<span style="font-family:KaiTi_GB2312;font-size:18px;">    Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
        If IsEmptyText(Me) = True Then '调用遍历函数判断文本框和选择框是否为空
            Exit Sub
        Else
            Dim thisUser As Entity.LoginModel = New Entity.LoginModel '定义一个实体对象来获得文本框的内容
            thisUser.user_name = txtUserid.Text.Trim()
            thisUser.user_pwd = txtPassword.Text

            Dim ub As BLL.Loginbll = New BLL.Loginbll '定义一个B层对象,通过B层返回结果,通知用户信息
            If ub.IsUser(thisUser) Then
                MessageBox.Show("登陆成功,欢迎使用!")
                Me.Hide()
                frmmain.Show()
            Else
                MessageBox.Show("登录失败,请重新输入!")
                Call NotEmptyText(Me)
            End If
        End If
    End Sub</span>

  B层是逻辑处理层,进行逻辑判断和放置功能函数。

<span style="font-family:KaiTi_GB2312;font-size:18px;">    Public Function IsUser(ByVal user As Entity.LoginModel) As Boolean
        Dim factory As New Factory.DBFactory
        '定义一个接口变量
        Dim IUser As IUserInfo
        '调用查找用户的工厂方法
        IUser = factory.FindUser
        Dim table As DataTable
        Dim flag As Boolean
        table = IUser.QueryUserInfo(user)
        If table.Rows.Count = 0 Then
            flag = False
        Else
            flag = True
        End If
        Return flag
    End Function</span>

  Factory层应用配置文件和反射技术实现灵活更换数据库功能,更换数据库的过程在这里就是一个拼接字符串。

<span style="font-family:KaiTi_GB2312;font-size:18px;">    Private Shared ReadOnly AssemblyName As String = "DAL" '声明程序集的名称
    Private Shared ReadOnly db As String = ConfigurationManager.AppSettings("DB") '读取配置文件
    Public Function FindUser() As IDAL.IUserInfo
        Dim className As String = AssemblyName + "." + db + "LoginDAL" '定义类名初值为DAL.SqlserverLoginDAL
        Dim iuser As IUserInfo
        iuser = CType(Assembly.Load(AssemblyName).CreateInstance(className), IUserInfo) '使用反射
        Return iuser
    End Function</span>

  IDAL层中写好我们需要的父类方法,通过DAL层实现。

<span style="font-family:KaiTi_GB2312;font-size:18px;">Public Interface IUserInfo
    '查询用户的接口函数  
    Function QueryUserInfo(ByVal user As Entity.LoginModel) As DataTable
End Interface</span>

  D层重写IDAL层的方法,借助于SQLHelper实现对用户名和密码的查询。

<span style="font-family:KaiTi_GB2312;font-size:18px;">Public Class SqlserverLoginDAL : Implements IUserInfo '实现接口函数

    '重写接口中查找用户方法
    Function QueryUserInfo(ByVal user As Entity.LoginModel) As DataTable Implements IUserInfo.QueryUserInfo
        Dim strSQL As String = "select * from User_info where userName= @username and passWord=@password"
        Dim Params() As SqlParameter = {New SqlParameter("@username", user.user_name), New SqlParameter("@password", user.user_pwd)}
        Dim helper As New SqlHelper
        Dim dbuser = helper.GetDataTable(strSQL, CommandType.Text, Params)
        Return dbuser
    End Function

End Class</span>

  运用抽象工厂,能够大大的降低B层和D层之间的耦合,使我们能够灵活的更换数据库,更好地满足用户的需求。纸上得来终觉浅,得知此事要躬行,理论上的真理还需要实践来验证。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值