本文從 .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.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)便於條件判斷。
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 / DbInterfaceGeneratorSqlClientFactory = ConcreteFactory1 / SqlDbInterfaceOracleClientFactory、MySqlClientFactory,結構大同小異為配合工廠模式,框架提供完整抽象類別階層:
DbParameter → IDataParameterDbDataAdapter → IDbDataAdapter → IDataAdapterDbDataReader → IDataReader作者公司產品從 .NET 1.x 遷移至 2.0,需同時支援兩框架並體現 2.0 優勢。採用策略:
DbProviderFactory 體系此做法與 Yahong 方案「不謀而合」。
過去我們從開源框架、社區原始碼學習設計模式。實則 .NET Framework 核心類庫本身就是極佳的設計模式實作範本。框架更新雖快,但模式作為骨架穩定不變。建議開發者多用 Reflector / ILSpy 深挖框架原始碼,程式設計造詣將長足精進。
https://www.oracle.com/technology/software/tech/windows/odpnet/index.htmlhttps://dev.mysql.com/downloads/connector/net/5.0.html