天天看點

1.3抽象工廠模式

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帶來的耦合。