zoukankan      html  css  js  c++  java
  • 终极版:由简单工厂模式,升级到抽象工厂模式(用到反射)

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

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

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

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

    效果图:

  • 相关阅读:
    2D Polygons( Poygon) CGAL 4.13 -User Manual
    2D Convex Hulls and Extreme Points( Convex Hull Algorithms) CGAL 4.13 -User Manual
    Linear and Quadratic Programming Solver ( Arithmetic and Algebra) CGAL 4.13 -User Manual
    3D Spherical Geometry Kernel( Geometry Kernels) CGAL 4.13 -User Manual
    2D Circular Geometry Kernel ( Geometry Kernels) CGAL 4.13 -User Manual
    MySQL开启日志跟踪
    Cookie&Session
    Web服务器——WSGI
    win10上安装redis
    Ubantu上安装Redis
  • 原文地址:https://www.cnblogs.com/caofangsheng/p/5003452.html
Copyright © 2011-2022 走看看