前面兩個已經學習簡單三層到簡單工廠模式的變化,但是簡單工廠模式還是有個缺點,就是簡單工廠中集合了所有的實例的創建。也不是很好。
現在想到使用抽象工廠的方式來實現這個:
我們在程序集中加上下面的代碼:
<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();
}
}
}
效果圖:
