1. 為什麼要用抽象工廠?用抽象工廠的好處
這裡我暫時還想不出有什麼好處
我覺得就是利用介面來實現封裝其子類,讓具體的工作交給它的子類去做。所以說這應該不能算抽象工廠的優點,只能算作介面的優點。
2. 在C#中怎樣用抽象工廠?
好,我們來看一下怎麼來實現
比如說我們要寫一個串連資料庫的組件,既支援sqlserver的,又要支援oledb的,這時我們就可以用AbstractFactory設計模式了。
先定義一個介面:
public interface IDbHelper
{
void ExecuteNonQuery();
DataSet ExecuteForDataSet(string sql);
}
然後定義兩個類(一個是sqlserver的,一個是oledb的)來繼承IdbHelper這個介面:
internal class SqlDbHelper:IDbHelper
{
public SqlDbHelper()
{
}
public void ExecuteNonQuery()
{
}
public DataSet ExecuteForDataSet(string sql)
{
//這裡實現sqlserver的方法
return null;
}
}
internal class OleDbHelper:IDbHelper
{
public OleDbHelper()
{
}
public void ExecuteNonQuery()
{
}
public DataSet ExecuteForDataSet(string sql)
{
//這裡實現oledb的方法
return null;
}
}
然後,來定義一個工廠類:
public class DbHelperFactory
{
public static IDbHelper CreateDbHelper(int DbType)
{
switch(DbType)
{
case 1:
return new SqlDbHelper();
case 2:
return new OleDbHelper();
default:
return null;
}
}
}
最後我們來調用這個工廠類:
public class AbstractFactoryTest
{
public void TestMethod()
{
IDbHelper sqldb=DbHelperFactory.CreateDbHelper(1);
sqldb.ExecuteNonQuery();
}
}
這個時候我們就可以很方便的調用資料庫組件了,在調用CreateDbHelper方法時,傳入參數為1,那麼就是調用SqlDbHelper這個類,傳入參數為2,那麼就是調用OleDbHelper這個類。當然傳入的參數你還可以把它變為枚舉型,這樣就更加方便了。
這樣的寫法也更利於擴充,比如說以後要添加一個OracleDbHelper時,你只需要再添加一個類,改動一個方法(CreateDbHelper)就可以了。