zoukankan      html  css  js  c++  java
  • 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带来的耦合。
  • 相关阅读:
    多线程案例
    Fault-Tolerance, Fast and Slow: Exploiting Failure Asynchrony in Distributed Systems
    LRU缓存实现案例
    kubernetes:基于ab的压力测试
    《软件测试52讲》——测试数据准备篇
    《软件测试52讲》——性能测试篇
    《软件测试52讲》——代码测试篇
    《软件测试52讲》——API自动化测试篇
    《软件测试52讲》——GUI自动化测试篇
    《梁宁产品思维30讲》——创新模式:找到创新模式,发现新大陆
  • 原文地址:https://www.cnblogs.com/jackyfei/p/3620892.html
Copyright © 2011-2022 走看看