zoukankan      html  css  js  c++  java
  • 利用抽象工厂实现自定义多数据类型接口

     

    这几天在看WroxVB.NET设计模式高级编程这本书,抽个时间整理一下自己的思维,把以前自己学的东西重新想一想。就是为了模式而模式吧。

     

    1.       抽象工厂模式

    GOF的定义:为创建相关联的或与其有依赖关系的对象族提供一个接口(广义接口),而无需为这些对象指定具体的类。

    联想到以前用的DAAB的数据类型接口ADOHelper其实就是就是这样的一个接口。在使用的时候首先定义一个AdoHelper对象,再利用多态对其进行赋值。那么我们在使用的过程中接触的始终都是AdoHelper对象,而无须考虑现在是OLEDB的类型还是SQLDB的类型了。

     

    用一个简单的例子说明抽象工厂的工作原理。做一个最简单的支持多数据类型的数据层基类。新建一个类库,自定义一个广义的接口(一个抽象类)命名为DBHelper,简单起见只写一个方法。

     

    Public MustInherit Class DBHelper

        
    Public MustOverride Function ExecuteDataSet(ByVal ConnectionString As StringByVal CommandText As StringAs DataSet

    End Class

    然后从DBHelper虚拟类下面派生出两个类,OleDB类和SqlDB类,是用以后面对DBHelper赋值的两个对象(定义里面的相关联或与其有依赖关系得对象族也就是他们了)。派生类重写DBHelper的方法(派生类里面的方法要不要重写可以看看虚拟类里面的方法修饰符。)

     

    Imports System.Data
    Imports System.Data.OleDb

    Public Class OleDb
        
    Inherits DBHelper



        
    Public Overrides Function ExecuteDataSet(ByVal ConnectionString As StringByVal CommandText As StringAs System.Data.DataSet
            
    Dim Connection As New OleDbConnection(ConnectionString)
            
    Dim Adap As New OleDbDataAdapter(CommandText, Connection)
            
    Dim ds As New DataSet
            Connection.Open()

            Adap.Fill(ds)

            Connection.Close()

            
    Return ds
        
    End Function
    End Class

    Imports System.Data
    Imports System.Data.SqlClient

    Public Class SqlDb
        
    Inherits DBHelper

       

        
    Public Overrides Function ExecuteDataSet(ByVal ConnectionString As StringByVal CommandText As StringAs System.Data.DataSet
            
    Dim Connection As New SqlConnection(ConnectionString)
            
    Dim Adap As New SqlDataAdapter(CommandText, Connection)
            
    Dim ds As New DataSet
            Connection.Open()

            Adap.Fill(ds)

            Connection.Close()
            
    Return ds
        
    End Function
    End Class


    然后创建一个新的Web项目做一下测试,在Web项目中添加对刚才那个项目的引用。放两个数据库,一个Access的一个SQL的。

     

        Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            
    '在此处放置初始化页的用户代码
            If Not Page.IsPostBack Then
                BindSqlDB()
            
    End If
        
    End Sub

        
    Sub BindOleDB()
            
    Dim Helper As DBHelper
            Helper 
    = New OleDb  '多态
            NewsGrid.DataSource = Helper.ExecuteDataSet(OleDbConnectionString, "select top 10 * from news order by NewsId desc")
            NewsGrid.DataBind()
        
    End Sub

        
    Sub BindSqlDB()
            
    Dim helper As DBHelper
            helper 
    = New SqlDb   '多态
            NewsGrid.DataSource = helper.ExecuteDataSet(SqlDbConnectionString, "select top 10 * from news order by NewsId asc")
            NewsGrid.DataBind()
        
    End Sub

        
    Public ReadOnly Property OleDbConnectionString() As String
            
    Get
                
    Return "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=F:\wwwroot\DAS\DB\**.mdb;"
            
    End Get
        
    End Property

        
    Public ReadOnly Property SqlDbConnectionString() As String
            
    Get
                
    Return "Data Source=**;Initial Catalog=********;User=sa;Pwd=********"
            
    End Get
        
    End Property

    最后在Page_Load事件里面把自己想要运行的数据库类型放里面就可以执行了。同时使用两个不同的对象却通过同一个对象Helper获取这就是我们想要实现的目的。显然一两个方法体现不出该模式的优越性。实际使用的情况要比这复杂的多了... 

  • 相关阅读:
    网络基础 03 交换机基本原理与配置
    网络基础 02 网络布线与数制转换
    C#操作excel(读取excel里的图片并show在页面上)
    让IIS支持中文文件名和目录
    Asp.net中防止用户多次登录的方法
    【转摘】一道关于实例化顺序的C#面试题
    选项卡调其他窗体方法
    同一个工作组的计算机能ping通不能访问对方共享资源
    Combobox出现System.Data.DataRowView的原因,以及指定ValueMember的时机问题
    无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口。
  • 原文地址:https://www.cnblogs.com/Bruce_H21/p/285070.html
Copyright © 2011-2022 走看看