1.概念:提供一個建立一系列相關對象的接口,而無需指定具體的類。
用簡單工廠改進抽象工廠執行個體:
public class DataAccess
{
private const readonly string dbstr="MSSQL";
public static IUser CreateUser()
{
IUser user = null;
switch (dbstr)
{
case "MSSQL":
user = new SqlServerUser(); //這裡的執行個體化是寫死在程式裡面
break;
case "ORACLE":
user = new OracleServerUser();//利用反射,利用字元串來執行個體化對象
default:
}
return user;
}
//出現壞味道
public static IDepartment CreateDepartment()
IDepartment department = null;
department = new SqlServerDepartment();
department = new OracleServerDepartment();
return department;
}
IUser user=DataAccess.CreateUser(); //直接得到資料庫執行個體,而不存在任何依賴
user.Insert(user);
問題:如果頻繁增加資料庫,隻能修改switch的case了
解決:
(1).利用反射+抽象工廠的模式 進行改造
private const readonly string db="MSSQL";
private const readonly string _assemblyName="程式集名稱";
string className = _assemblyName+"."+db+"User";
return (IUser)Assembly.Load(assemblyName).CreateInstance(className);
(2).利用反射+配置檔案 進行改造
<configuration>
<appsettings>
<add key="DB" value="MSSQL"/>
</appsettings>
</configuration>
private const readonly string db=ConfigurationManager.AppSettings("DB");
private const readonly string _assemblyName="程式集名稱";
從這個角度來說,反射可以很好解決if,switch帶來的耦合。