终极版:由简单工厂模式,升级到抽象工厂模式(用到反射)
前面两个已经学习简单三层到简单工厂模式的变化,但是简单工厂模式还是有个缺点,就是简单工厂中集合了所有的实例的创建。也不是很好。
现在想到使用抽象工厂的方式来实现这个:
我们在程序集中加上下面的代码:
<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(); } } }
效果图:
每天学一点,每天积累一天,进步就不止一点点!PS:好记性不如烂笔头,学会总结,学会思考~~~
----要飞翔,必须靠自己!