• 1.3抽象工厂模式


    1.概念:提供一个创建一系列相关对象的接口,而无需指定具体的类。
     
    用简单工厂改进抽象工厂实例:
    public class DataAccess 
    {
         private const readonly string dbstr="MSSQL";
     
         public static IUser CreateUser()
         {
              IUser user = null;
              switch (dbstr)
              {
                   case "MSSQL":
                   user = new SqlServerUser();  //这里的实例化是写死在程序里面
                   break;
                   case "ORACLE":
                   user = new OracleServerUser();//利用反射,利用字符串来实例化对象
                   break;
                   default:
              }
              return user;
         }
     
         //出现坏味道
         public static IDepartment CreateDepartment()
         {
              IDepartment department = null;
              switch (dbstr)
              {
                   case "MSSQL":
                   department = new SqlServerDepartment();
                   break;
                   case "ORACLE":
                   department = new OracleServerDepartment();
                   break;
                   default:
              }
              return department;
         }
    }
     
    IUser user=DataAccess.CreateUser(); //直接得到数据库实例,而不存在任何依赖
    user.Insert(user);
     
    问题:如果频繁增加数据库,只能修改switch的case了
     
    解决:
    (1).利用反射+抽象工厂的模式 进行改造
     
    public class DataAccess 
    {
         private const readonly string db="MSSQL";
         private const readonly string _assemblyName="程序集名称";
     
         public static IUser CreateUser()
         {
              string className = _assemblyName+"."+db+"User";
              return (IUser)Assembly.Load(assemblyName).CreateInstance(className);
         }
    }
     
    (2).利用反射+配置文件 进行改造
    <configuration>
         <appsettings>     
              <add key="DB"  value="MSSQL"/>
         </appsettings>
    </configuration>
     
    public class DataAccess 
    {
         private const readonly string db=ConfigurationManager.AppSettings("DB");
         private const readonly string _assemblyName="程序集名称"; 
    }
     
    从这个角度来说,反射可以很好解决if,switch带来的耦合。
  • 相关阅读:
    AngularJS 1.x系列:AngularJS过滤器(4)
    AngularJS 1.x系列:AngularJS控制器(3)
    AngularJS 1.x系列:AngularJS简介及第一个应用(2)
    AngularJS 1.x系列:Node.js安装及npm常用命令(1)
    MySQL系列:索引基本操作(4)
    基于 Mathematica 的机器人仿真环境(机械臂篇)[转]
    使用耳切法将多边形三角化【转】
    asp.net调用非托管dll,无法加载 DLL,找不到指定模块解决方法。【转】
    ASP.NET与非托管DLL的那些事儿【转+增】
    cesium常用设置【转】
  • 原文地址:https://www.cnblogs.com/jackyfei/p/3620892.html
Copyright © 2020-2023  润新知