1. 程式人生 > >C# - 設計模式 - 抽象工廠模式

C# - 設計模式 - 抽象工廠模式

tel 總結 num provider ndb back reat param []

抽象工廠模式

問題場景

有100個方法對Animal類型進行了引用,所以可能需要new100次Animal對象,如果總是使用new創建對象,那麽100處都會有對該對象的引用。假如今後Animal被禁止使用,而用另一個具有與Animal類似行為的XAnimal替代Animal,那麽你需要在100處使用new創建Animal的地方將代碼修改為XAnimal,而假如可以利用抽象將這些引用全部指向一個抽象的實現,比如Animal和XAnimal都從一個Biological的抽象類派生,再用一個專門制造抽象實現的工廠類來返回Biological抽象的實例,再創建一個專門制造XAnimal的工廠類和制造Animal的工廠類,這兩個工廠類都從抽象工廠派生,那麽今後需求改動時,只需要new一個創建XAnimal的工廠類來創建XAnimal和Animal的共同抽象返回給外部調用即可。

總結模式

工廠模式將所有對具象的引用更改成了對抽象的引用,要使用抽象工廠模式,那麽所有的類型都應該從抽象派生,以便徹底解耦對具象類型的依賴。

示例代碼

namespace AppCUI
{
//動物的抽象
public abstract class Biological
{
public abstract void Say( );
}

//動物的具象
public class Animal : Biological
{
public override void Say( )
{
Console
.WriteLine( "汪汪" );

}
}

//工廠的抽象
public abstract class Factory
{
//創建動物的抽象
public abstract Biological CreateBiological( );
}

//工廠的具象
public class AnimalFactory : Factory
{
//返回一個抽象的實體
public override Biological CreateBiological( )
{
return
new Animal( );

}
}

public class Programe
{
static void Main( string[] args )
{
Factory factory = new AnimalFactory( ); //得到抽象工廠的實現,今後需要XAnimal時,只需要new出一個專門制造XAnimal的工廠類即可
Biological biological = factory.CreateBiological( ); //得到抽象動物的實現
biological.Say( );
}
}
}

在System.Data.dll中的System.Data.Common.DbProviderFactory抽象工廠就提供了一系列用於創建操作數據庫抽象類的抽象方法

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 );
}

DbCommand、DbCommandBuilder 、DbConnection 、DbConnectionStringBuilder 、DbDataAdapter 等等都是抽象的類型,DbProviderFactory由SqlClientFactory實現,SqlClientFactory專門創建基於sql的數據庫操作類。這樣就解耦了對具象的引用,你也可以自定義OracleClientFactory、MySqlClientFactory工廠,實現創建對應的數據庫操作類。

public sealed class SqlClientFactory : DbProviderFactory, IServiceProvider
{
//通過靜態的Instance字段獲取一個SqlClientFactory實例,確保全局唯一
public static readonly SqlClientFactory Instance = new SqlClientFactory( );

// 重寫抽象工廠中的方法
public override DbCommand CreateCommand( )
{
// 創建DbCommand的具象
return new SqlCommand( );
}

public override DbCommandBuilder CreateCommandBuilder( )
{
return new SqlCommandBuilder( );
}

public override DbConnection CreateConnection( )
{
return new SqlConnection( );
}

public override DbDataAdapter CreateDataAdapter( )
{
return new SqlDataAdapter( );
}

//……
}

  

  

C# - 設計模式 - 抽象工廠模式