首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 2.0 框架中的 Abstract Factory 模式實踐解析

     編輯:關於.NET

本文從 .NET Framework 2.0 核心類庫角度,剖析 Abstract Factory(抽象工廠)模式 在資料庫連接元件中的實際應用,並對比社區早期實作(如 DbService、Yahong 方案),揭示框架級設計模式的最佳實踐。

一、社區早期實作回顧

DbService 是較早採用抽象工廠模式設計的資料庫連接類,設計思路與 Yahong 方案(https://www.cnblogs.com/Yahong111/archive/2007/07/18/822946.html)高度相似。核心思想:定義介面/抽象基類,具體廠商實作對應工廠,實現資料庫存取的解耦與切換。

二、.NET 2.0 內建實作:System.Data.Common.DbProviderFactory

微軟在 .NET 2.0 正式採用此模式,核心類別位於 System.Data.dll:

public abstract class DbProviderFactory {
    protected DbProviderFactory();
    public virtual DbCommand CreateCommand();
    public virtual DbCommandBuilder CreateCommandBuilder();
    public virtual DbConnection CreateConnection();
    public virtual DbConnectionStringBuilder CreateConnectionStringBuilder();
    public virtual DbDataAdapter CreateDataAdapter();
    public virtual DbDataSourceEnumerator CreateDataSourceEnumerator();
    public virtual DbParameter CreateParameter();
    public virtual CodeAccessPermission CreatePermission(PermissionState state);
    public virtual bool CanCreateDataSourceEnumerator { get; }
}

關鍵觀察:微軟選擇 抽象類別 而非介面作為 Abstract Factory。基底方法預設回傳 null,子類別覆寫實作。這減少了介面強制實作所有成員的負擔,且提供預設行為(回傳 null)便於條件判斷。

具體工廠實作:SqlClientFactory

public sealed class SqlClientFactory : DbProviderFactory {
    public static readonly SqlClientFactory Instance;
    private SqlClientFactory();
    public override DbCommand CreateCommand() { return new SqlCommand(); }
    public override DbConnection CreateConnection() { return new SqlConnection(); }
    public override DbParameter CreateParameter() { return new SqlParameter(); }
    // ... 其他成員對應 SqlClient 具體類別
}

對應關係:

  • DbProviderFactory = AbstractFactory / DbInterfaceGenerator
  • SqlClientFactory = ConcreteFactory1 / SqlDbInterface
  • Oracle/MySQL 官方驅動同樣提供 OracleClientFactory、MySqlClientFactory,結構大同小異

輔助抽象類別體系

為配合工廠模式,框架提供完整抽象類別階層:

  • DbParameter → IDataParameter
  • DbDataAdapter → IDbDataAdapter → IDataAdapter
  • DbDataReader → IDataReader
  • 多為抽象類別,提供預設實作與擴充點

三、實務遷移策略:雙框架共存

作者公司產品從 .NET 1.x 遷移至 2.0,需同時支援兩框架並體現 2.0 優勢。採用策略:

  1. .NET 2.0 專用:直接使用 DbProviderFactory 體系
  2. .NET 1.x 專用:維持介面基礎實作,參考 DbService 模式
  3. 為保證邏輯對應,在 1.x 專案中手動實作同名類別(SqlClientFactory 等),採用反射方式動態載入

此做法與 Yahong 方案「不謀而合」。

四、啟示:.NET 框架本身就是最好的設計模式教材

過去我們從開源框架、社區原始碼學習設計模式。實則 .NET Framework 核心類庫本身就是極佳的設計模式實作範本。框架更新雖快,但模式作為骨架穩定不變。建議開發者多用 Reflector / ILSpy 深挖框架原始碼,程式設計造詣將長足精進。

附:官方驅動下載

  • Oracle:https://www.oracle.com/technology/software/tech/windows/odpnet/index.html
  • MySQL:https://dev.mysql.com/downloads/connector/net/5.0.html
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved