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带来的耦合。
  • 相关阅读:
    Dapper and Repository Pattern in MVC
    在linux中使用多个redis端口来构建redis集群
    搭建Sql Server AlwaysOn 视频教程
    支付宝支付插件使用文档
    NopCommerce添加事务机制
    NopCommerce(3.9)作业调度插件
    微信扫码支付插件使用文档
    生成HTML表格的后台模板代码
    json字符串和字典类型的相互转换
    NopCommerce适应多数据库方案
  • 原文地址:https://www.cnblogs.com/jackyfei/p/3620892.html
Copyright © 2011-2022 走看看