概述:
抽象工廠(abstractFactory):提供一個建立一系列相關或相互依賴對象的介面,而無需指定他們的具體類
適用場合:
1.一個系統要獨立於它的產品的建立、組合和表示時。
2.一個系統要由多個產品系列中的一個來配置時。
3.當你強調一系列相關的產品對象的設計以便進行聯合使用時。
4.當你提供一個產品類庫,而只想顯示他們的介面而不是實現時。
類圖:
範例程式碼:
這裡列舉出當前比較簡單的資料庫訪問層的代碼結構,通過反射來實現,沒有用單純的抽象原廠模式
///<summary>
/// 提供者
///</summary>
publicinterface IUser
{
void AddUser();
}
///<summary>
/// 資料訪問層的工廠配置
///</summary>
class DataAccess
{
///<summary>
/// 程式集路徑 一般通過設定檔來讀取
///</summary>
privatestaticstring path ="Jqpress.Data";
///<summary>
/// 資料庫類型 一般通過設定檔來讀取
///</summary>
privatestaticstring dbtype ="Sqlserver";
privatestaticobject lockObject =newobject();
privatestatic IUser _user =null;
///<summary>
/// 通過反射執行個體化user
///</summary>
///<returns></returns>
publicstatic IUser InstanceUser()
{
string className = path+"." + dbtype +".User";
return CreateInstance<IUser>(_user,className);
}
///<summary>
/// 通過單例 執行個體化反射
///</summary>
///<typeparam name="T"></typeparam>
///<param name="path"></param>
///<param name="className"></param>
///<returns></returns>
privatestatic T CreateInstance<T>(T _instance,string className)
{
if (_instance==null)
{
lock (lockObject)
{
if(_instance==null)
{
_instance = (T)Assembly.Load(path).CreateInstance(className);
}
}
}
return _instance;
}
}
///<summary>
/// 實現IUser介面
///</summary>
class UserData:IUser
{
publicvoid AddUser() { }
}
///<summary>
/// 業務層調用
///</summary>
class Service
{
static IUser dao = DataAccess.InstanceUser();
publicvoid AddUser()
{
dao.AddUser();
}
}
小結:
抽象原廠模式在設計底層資料庫存取碼的時候用到的比較多,但是一般情況下都是通過反射來實現