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带来的耦合。
  • 相关阅读:
    mysql完全卸载教程(图文详细)
    windows:安装django
    01 Java的NIO三大组件以及buffer的原理以及应用
    16 JDK8的concurrenthashmap的原理介绍
    07 Java源码字节码层面简单分析
    06 Java字节码的基础知识
    05 Java的class文件的组成介绍
    04 G1垃圾回收器的介绍以及垃圾回收调优的基础知识和简单案例
    03 JVM中垃圾回收算法以及典型的垃圾回收器
    02 Java的引用类型以及应用场景
  • 原文地址:https://www.cnblogs.com/jackyfei/p/3620892.html
Copyright © 2011-2022 走看看