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带来的耦合。
  • 相关阅读:
    170829-关于AOP面向切面编程
    170826-关于spring的知识点及练习
    170814-17关于javaweb的知识点
    scrapy之手机app抓包爬虫
    tornado之WebSocket
    Tornado异步(2)
    tornado异步(1)
    爬虫之动态HTML处理(Selenium与PhantomJS )动态页面模拟点击
    爬虫之动态HTML处理(Selenium与PhantomJS )执行 JavaScript 语句
    爬虫之动态HTML处理(Selenium与PhantomJS )网站模拟登录
  • 原文地址:https://www.cnblogs.com/jackyfei/p/3620892.html
Copyright © 2011-2022 走看看