抽象工廠模式在工廠方法模式的基礎上進行了改進,它提供了一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。 使用抽象工廠模式實現資料庫切換例子如下: 首先定義兩個對象的介面和它的多個具體的實現 然後定義抽象工廠介面,和具體的工廠,具體的工廠負責創建一系列相關的對象 客戶端使用不同的工廠實 ...
抽象工廠模式在工廠方法模式的基礎上進行了改進,它提供了一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。
使用抽象工廠模式實現資料庫切換例子如下:
首先定義兩個對象的介面和它的多個具體的實現
public interface IUser { void Insert(string name); IUser GetUser(int id); } public interface IDepartment { void Insert(string name); IDepartment GetDept(int id); } public class SQLServerUser : IUser { #region IUser 成員 public void Insert(string name) { Console.WriteLine("Insert sqlserver user"); } public IUser GetUser(int id) { Console.WriteLine("Get sqlserver user"); return null; } #endregion } public class AccessUser : IUser { #region IUser 成員 public void Insert(string name) { Console.WriteLine("Insert access user"); } public IUser GetUser(int id) { Console.WriteLine("Get access user"); return null; } #endregion } public class SQLServerDepartment : IDepartment { #region IDepartment 成員 public void Insert(string name) { Console.WriteLine("Insert sqlserver department"); } public IDepartment GetDept(int id) { Console.WriteLine("Get sqlserver department"); return null; } #endregion } public class AccessDepartment : IDepartment { #region IDepartment 成員 public void Insert(string name) { Console.WriteLine("Insert access department"); } public IDepartment GetDept(int id) { Console.WriteLine("Get access department"); return null; } #endregion }
然後定義抽象工廠介面,和具體的工廠,具體的工廠負責創建一系列相關的對象
public interface IFactory { IUser UserData(); IDepartment DeptData(); } public class SQLServerFactory : IFactory { #region IFactory 成員 public IUser UserData() { return new SQLServerUser(); } public IDepartment DeptData() { return new SQLServerDepartment(); } #endregion } public class AccessFactory : IFactory { #region IFactory 成員 public IUser UserData() { return new AccessUser(); } public IDepartment DeptData() { return new AccessDepartment(); } #endregion }
客戶端使用不同的工廠實例,完成一系列產品對象的創建
//實例化Sqlserver資料庫訪問對象 //IFactory factory = new SQLServerFactory(); //實例化Access資料庫訪問對象, 兩個工廠對象二選一 IFactory factory = new AccessFactory(); IUser userData = factory.UserData(); userData.Insert("test"); userData.GetUser(1); IDepartment deptData = factory.DeptData(); deptData.Insert("test"); deptData.GetDept(1);
抽象工廠方法的優點是便於交換產品系列,由於具體工廠類在一個應用中只需要在初始化的時候出現一次,所以改變一個應用的具體工廠變得非常容易,只需要改變具體工廠即可。
另外,由於它讓具體的創建實例過程與客戶端分離,客戶端是通過抽象藉口操縱實例的,產品的具體類名也被具體工廠的實現分離,不會出現在客戶端代碼中。
但是抽象工廠方法在需要初始化很多次的時候則是不便使用的,這是則可以使用簡單工廠加配置和反射。
下麵將抽象工廠改為簡單工廠加配置和反射完成
/// <summary> /// 簡單工廠模式結合反射,使用反射避免了switch case 的判斷 /// </summary> public class SimplyFactory { private static string assemblyName = "AbstractFactoryModel"; //該字元串可以使用配置文件 private static string dbType = "SQLServer"; public IUser UserData() { IUser userData = (IUser)Assembly.Load(assemblyName).CreateInstance(assemblyName + "." + dbType + "User"); return userData; } public IDepartment DeptData() { IDepartment deptData = (IDepartment)Assembly.Load(assemblyName).CreateInstance(assemblyName + "." + dbType + "Department"); return deptData; } }
在需要更改實例化的對象時,不需要修改代碼,而只需要修改配置文件即可,客戶端的使用如下:
//實例化時無需制定任何類型,全部由工廠根據配置實現 SimplyFactory factory = new SimplyFactory(); IUser userData = factory.UserData(); IDepartment deptData = factory.DeptData(); userData.Insert("test"); userData.GetUser(1); deptData.Insert("test"); deptData.GetDept(1);
這樣,客戶端在需要實例化多個工廠的時候,只需要修改配置文件,不需要修改每一個實例化代碼。