程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET2.0框架中的AbstractFactory模式

.NET2.0框架中的AbstractFactory模式

編輯:關於.NET

我這裡只是從別的角度闡述一下AbstractFactory在這種應用場景下的發展,內容不多,希望大家見諒。

1. DbService 是我看到的第一個使用抽象工廠模式設計的數據庫鏈接類。其實在幾年前網上就有人寫了這個東西,代碼不多,但應用的背景和設計思路與永紅(http://www.cnblogs.com/Yahong111/archive/2007/07/18/822946.html)

的思路非常相似。大家可以去網上搜一搜就知道了。

2. 微軟也采用了這種模式在他們的NET2.0框架中。我甚至可以對NET2.0中的新添的一些類與模式文章中類內容對號入座。只要大家Reflector看一下.NET2.0框架代碼即可。為了清楚起見,我只在這裡做一下簡單說明,旨在拋磚引玉。

System.Data.Common.DbProviderFactory, 位置在System.Data.dll中。注意這是一個 抽象類

public abstract class DbProviderFactory
{  
// Methods
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);
// Properties
public virtual bool CanCreateDataSourceEnumerator { get; }
}

 

這個類在Abstract Factory模式下就是AbstractFactory,也就是永紅所說的那個DbInterfaceGenerator接口。但為什麼微軟要用抽象類而不是接口(本身也偏向於使用接口),也只有微軟才知道了:)。

目前我的理解是減少基類中一些不必要的實現代碼或進行條件判斷時(如為 null),有相關的返回值進行比較如下:

public virtual DbCommand CreateCommand()
{
return null;
}

 

這個函數就是DbProviderFactory類的一個虛方法,這個方法會在子類中將被重寫, 而子類(SqlClientFactory)中的代碼類內容如下(位於System.Data.SqlClient.SqlClientFactory)

public sealed class SqlClientFactory : DbProviderFactory
{
// Fields
public static readonly SqlClientFactory Instance;
// Methods
static SqlClientFactory();
private SqlClientFactory();
public override DbCommand CreateCommand()
{
return new SqlCommand();
}
public override DbCommandBuilder CreateCommandBuilder()...
public override DbConnection CreateConnection()
{
return new SqlConnection();
}
public override DbConnectionStringBuilder CreateConnectionStringBuilder()...
public override DbDataAdapter CreateDataAdapter();
public override DbDataSourceEnumerator CreateDataSourceEnumerator()...
public override DbParameter CreateParameter()
{
return new SqlParameter();
}
public override CodeAccessPermission CreatePermission(PermissionState state);
// Properties
public override bool CanCreateDataSourceEnumerator { get; }
}

 

看到這裡大家應該明白一些了吧。顧名思議,SqlClientFactory就是AbstractFactory模式圖中的ContreateFactory1類 ,對應永紅的圖中的SqlDbInterface接口。另外大家也可以從ORACLE,MySql官方下載最新的DLL,反射裡面的OracleClientFactory和MySqlClientFactory代碼,大家會看到DLL中的相關方法“模樣”大同小異。

注:為了使用這個DbProviderFactory類,微軟還出了一些輔助類,如:

DbParameter 繼承自 IDataParameter  

DataAdapter 繼承自 IDataAdapter

DbDataAdapter  繼承自 IDbDataAdapter 

DbDataReader 繼承自 IDataReader

並且這些類基本都是抽象類:)

說到這裡,可能有人要說了,微軟這麼做到底是圖什麼呀!原有的接口在那呆的挺好,大家只要繼承並實現裡面想要的功能部份就行了。其實這裡恰恰巧說明了微軟的“聰明”之外,不知道大家看到沒有,在前些年JAVA社區還在討論框架,AOP , IOC 時,Microsoft官方似乎反應比較“冷淡”,但如今天我們從.net2 以及 .net3看到了對於AOP和很多精典框架模式的嵌入,這裡有從JAVA類庫思想中得來的經驗,也有開源社區的“貢獻”。微軟恰恰在上述的那些理論或代碼框架成功(甚至有成功案例)情況下快速加入這些東西,這不能不說微軟很“聰明”。 不好,又跑題了:)

3.因為最近公司的產品在向.net2 框架過度,所以就出現了這麼一個問題:如果產品要在這兩個框架都能順利運行,同時還要體現.net2 的一些“新”的優勢,那只有寫兩個"不同"的鏈接類。其中一個用到了上面的那個DbProviderFactory類,而在.net1 下基本采用接口,參考DbService,同時為了保證兩套代碼的邏輯對應關系,我簡單的實現了SqlClientFactory等在2.0框架中才有的類。實現的方法參見.net2的相關類代碼(本人采用同名方式引入了這幾個類)。另外關於使用實現我們也采取“反射”方式。這與永紅所想的方法是“不謀而合”了 :)

說到這裡,有一個現象我想再談談我的看法,以前看設計模式只有從開源的框架,技術社區或別人的源碼中分析。其實當我們還在為找出精典的應用設計模式的代碼(net版本)而苦苦搜索時,微軟已經給我們打開了一個新的“窗口”,那就是.net 框架本身。這個與我們朝夕相伴的家伙其實就是一個非常好的學習設計模式的例子。雖然.net 框架推陳出新的速度讓人只能用"驚歎"來形容,但模式這種東西在裡面卻安然無恙,必定這是框架的骨頭呀。所以我希望大家多挖.net框架的代碼,這會使我們的程序設計水平有長足的提高。

附:

Oracle數據庫的接口 http://www.oracle.com/technology/software/tech/windows/odpnet/index.html

MySql 數據庫的接口 http://dev.mysql.com/downloads/connector/net/5.0.html

另外我們的公司的產品是開源的,大家可以在我們在2.0版本看到上面我所說的實現方式。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved