首页 > 技术文章 > 终极版:由简单工厂模式,升级到抽象工厂模式(用到反射)

caofangsheng 2015-11-28 21:09 原文

前面两个已经学习简单三层到简单工厂模式的变化,但是简单工厂模式还是有个缺点,就是简单工厂中集合了所有的实例的创建。也不是很好。

现在想到使用抽象工厂的方式来实现这个:

我们在程序集中加上下面的代码:

<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();
        }
    }
}

效果图:

 

推荐阅读