前面兩個已經學習簡單三層到簡單工廠模式的變化,但是簡單工廠模式還是有個缺點,就是簡單工廠中集合了所有的實例的創建。也不是很好。
現在想到使用抽象工廠的方式來實現這個:
我們在程序集中加上下面的代碼:
<appSettings> <!--命名空間--> <add key="DALNameSpace" value="DAL"/> <!--程序集--> <add key="DALAssembly" value="DAL"/> </appSettings>
然後新建一個抽象工廠類:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Configuration; using IDAL; namespace DALFactory { public class DALAbstractFactory { /// <summary> ///命名空間 /// </summary> public static string DALNameSpace { get { return ConfigurationManager.AppSettings["DALNameSpace"]; } } /// <summary> /// 程序集 /// </summary> public static string DALAssembly { get { return ConfigurationManager.AppSettings["DALAssembly"]; } } public IClassDAL GetClassInstance() { string fullNameSpace = DALNameSpace + ".ClassDAL"; return CreateInstance(fullNameSpace, DALAssembly) as IDAL.IClassDAL; } /// <summary> /// 創建實例 /// </summary> /// <param name="fullClassNameSpace"></param> /// <param name="assembly"></param> public static object CreateInstance(string fullClassNameSpace,string assembly) { var DALAssembly= Assembly.Load(assembly); return DALAssembly.CreateInstance(fullClassNameSpace); } } }
上面的方法,通過反射,創建DAL數據訪問層的實例。
現在在業務層,我們可以這樣:
using DAL; using Entity; using IDAL; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BLL { public class ClassBLL { //耦合度太高 // ClassDAL dal = new ClassDAL(); //這種還是有耦合,業務層和數據訪問層耦合度太高 //IClassDAL dal = new ClassDAL(); //引入簡單工廠模式 //IClassDAL dal = DALFactory.DALFactory.GetClassInstance(); //引入抽象工廠 IClassDAL dal = DALFactory.DALAbstractFactory.GetClassInstance(); /// <summary> /// 獲取Class列表 /// </summary> /// <returns></returns> public List<ClassEntity> GetList() { return dal.GetList(); } } }
效果圖: