前面两个已经学习简单三层到简单工厂模式的变化,但是简单工厂模式还是有个缺点,就是简单工厂中集合了所有的实例的创建。也不是很好。
现在想到使用抽象工厂的方式来实现这个:
我们在程序集中加上下面的代码:
<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(); } }}
效果图:
原标题:终极版:由简单工厂模式,升级到抽象工厂模式(用到反射)
关键词:反射