c# 面向对象设计模式–简单工厂模式


面向对象基础:抽象 封装 多态 继承
面向对象原则:封装变化 多用组合 少用继承 针对接口编程 依赖抽象 不依赖具体 尽量松耦合 对修改关闭 对扩展开放


前言:
工厂模式的主要思想:
将对象的创建放入工厂中,当有新的类型的子对象产生时,只需要修改工厂方法,就可以使当前类支持新的类型,易于系统维护。
在系统开发中,我们常将工厂模式应用于DB层,使DB层可以生产出“多种数据库操作类”,来应对系统的各种变化。




工厂模式的产生

一个业务应用类A
一个数据库实现包B(namespace B) (B中包含 MSSQL操作类 class MSSQL{} MySql操作类 class MySql{} Oracle操作类 class Oracle{} DB2操作类 class DB2{} …)
当A中需要使用数据库操作时,假如此时我们需要使用MSSQL操作类,这时,我们需要new一个操作对象

 class A{
    DB db;    
    db = new MSSQL();
      /*
       在实际业务中,此处使用了具体类会导致程序不具有扩展性
       当我们切换其它数据库时,需改写所有应用类中的代码
      */
  }
  
  
class A{ DB db; if (dbType =="MSSQL") { db = new MSSQL(); }else if(dbType =="MySql") { db = new MySql(); }else if(dbType =="Oracle") { db = new Oracle(); } ... /* 在实际业务中,当我们扩展一个数据库时,所有的应用代码都必须修正 */ }


以上两种应用代码的写法,当有变化或扩展时,就必须重新打开应用类代码进行检查和修改,由于有大量的修改,会加大系统的修改的错误几率,并且违背了”对修改关闭”的原则
所以为了修正以上,我们必须采用一种全新的编程方式,那么就是针对”接口编程”,因为针对接口编写的代码,可以支持多态,它可以关联任何实现此接口的类。



封装db对象的创建代码

  class A{
    DB db;
    /*将创建对象的代码进行抽离放入一个新的对象(DbFactory),这个新对象负责进行的创建*/
     ...
     /*应用相关操作*/
   }
   
  class DbFactory{
    
    public Db DbFactory()
     {
      Db db; //Db为interface
      if (dbType =="MSSQL")
      {
       db = new MSSQL();
      }else if(dbType =="MySql")
      {
       db = new MySql();
      }else if(dbType =="Oracle")
      {
       db = new Oracle();
      }
      return Db;
    }
  }


我们将DbFactory这个新对象称之为”工厂”。
工厂对象主要是处理创建对象。由于有了DbFactory对象后,当应用类A需要使用数据库操作对象时,需调用工厂类产生数据库操作类,
从class A class DbFactory 我们可以看出,DbFactory工厂主要为应用类A提供Db操作类服务。



创建一个简单DB工厂

   class DbSimpleFactory{
    
    public Db CreateDb(string  dbType)   //简单工厂中,定义一个CreateDb方法,所有客户使用这个方法来实例化新的对象
     {
      Db db = null; //Db为interface
      if (dbType =="MSSQL")
      {
       db = new MSSQL();
      }else if(dbType =="MySql")
      {
       db = new MySql();
      }else if(dbType =="Oracle")
      {
       db = new Oracle();
      }
      return Db;
    }
  }


简单工厂的优点:
当增加新的数据库对象时,系统易于修改,便于维护
可以使对象在运行时,动态的组合当前符合条件的类