抽象原廠模式
1)抽象原廠模式(Abstract
Factory),提供一個建立一系列相關或相互依賴對象的介面,而無需制定它們具體的類。
2)以不同資料庫中的兩種表為例
3)適用性
在以下情況下可以試用AbstractFactory模式
- 一個系統要獨立於它的產品的建立、組合和表示時。
- 一個系統要多個產品系列中的一個來配置。
- 當你要強調一系列相關的產品對象的設計以便進行聯合使用時。
- 當你提供一個產品類庫,而只想顯示它們的介面而不是實現。
4)抽象原廠模式的優缺點
優點:
- 容易改變產品的系列,由於具體工廠類,在一個應用中只需要在初始化的時候出現一次,這就使得改變一個應用的具體工廠變得非常容易.
- 將一個系列的產品族統一到一起建立。
缺點:
產品族中擴充新的產品是很困難的,它需要修改抽象工廠的介面。(如果增加項目表Project,就需要增加三個類,Iproject、SqlserverProject、AcessProject,還需要改Ifactory、SqlserverFactory和AcessFactory才可以完全實現。要改三個類,這就太糟糕了。)
5)用簡單工廠來改進抽象工廠
代碼:
classDataAccess
{
private static readonly string db ="Sqlserver";
public static IUser CreateUser()
{
IUser result = null;
switch (db)
{
case "Sqlserver":
result =new SqlserverUser();
break;
case "Access":
result = new AccessUser();
break;
}
return result;
}
public static IDepartmentCreateDepartment()
{
IDepartment result = null;
switch(db)
{
case "Sqlserver":
result=newSqlserverDepartment ();
break;
case "Access":
result =new AccessDepartment ();
break;
}
return result;
}
}
static void Main(string[] args)
{
User user = new User();
Department dept = new Department();
IUser iu = DataAccess.CreateUser();
iu.Insert(user);
iu.GetUser(1);
IDepartment id =DataAccess.CreateDepartment();
id.Insert (dept);
id.GetDepartment(1);
Console.Read();
}
6)用反射+抽象工廠的資料訪問程式(根據字串去哪個地方應該要執行個體化那一個類,這樣可以去掉Case語句)
classDataAccess
{
private static readonly stringAssemblyName = "抽象工廠五";
private static readonly string db ="Sqlserver";
public static IUser CreateUser()
{
string className = AssemblyName +"." + db + "User";
return(IUser)Assembly.Load(AssemblyName).CreateInstance(className);
}
public static IDepartmentCreateDepartment()
{
string className = AssemblyName +"." + db + "Departemnt";
return(IDepartment)Assembly.Load(AssemblyName).CreateInstance(className);
}
}
6)用反射+設定檔實現資料訪問程式(來解決更改資料庫的問題。)
設定檔:
<?xmlversion="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntimeversion="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings >
<add key ="DB" value="Sqlserver"/>
</appSettings>
</configuration>
在開頭添加 using
System.configuration,有時候還是提示錯誤,這就需要添加引用+程式集中找到system.configuration勾選上即可
在代碼中添加設定檔(改DB賦值即可):
privatestatic readonly string db = ConfigurationManager.AppSettings["DB"];