简单工厂和工厂方法的区别

     在《简单工厂模式和策略模式的区别》中说道简单工厂中用一个Factory类来专门负责产生具体的类,在添加一个功能的时候要做两个动作,一是添加一个FunctionC类继承自Function类,二是要修改Factory类的CreateObject方法。

     代码如下:

代码
public   class  Factory
{
  
public   static  Function CreateObject( string  condition)
  {
    Function ft 
=   null ;
    
switch  condition:
    
case  conditionA:
    {
      ft 
=   new  FunctionA();
      
break ;
    }
    
case  conditionB:
    {
      ft 
=   new  FunctionB();
      
break ;
    }
    
case  conditionC:         // 修改了CreateObject方法
    {
      ft 
=   new  FunctionC();
      
break ;
    }    
    
default :
    
break ;
  }
}
public  calss Function
{
   
public   virtual   void  DoSomething()
   {
     .... ....
   }
}
public   class  FunctionA:Function
{
 
public   void   override  DoSomething()
 {
   .... ...
 }
}
public  calss FuctionB:Function
{
  
public   void   override  DoSomething()
  {
    .... ....
  }
}
// 扩展一个新的类
public  calss FuctionC:Function
{
  
public   void   override  DoSomething()
  {
    .... ....
  }
}
public   static   void  main()
{
  
string  condition  =   " asdfasdf " ;
  Function fc 
=  Factory.CreateObject(condition);
  fc.DoSomething(); 
}

     这样看起来也很方便,但是软件设计里面有个原则开放封闭原则,对于扩展开放,对于修改封闭。这里修改了CreateObject()方法,做项目的时候发现只要修改就会有可能出错误,可能就是这个道理吧。这样就诞生了工厂方法模式。  

     工厂方法模式省去了原来的Factory类,不用这个类来生产对象,但是使用一系列的工厂类来专门负责产生相应的类。在客户端要想使用这个功能类,首先要获得它的工厂类,由这个工厂类来产生相应的功能类。这样添加一个功能的时候也要做两个工作,一是添加相应的功能类,二是添加一个工厂类。工厂方法模式定义一个用于创建对象的工厂接口IFactory,让这个接口的子类FactoryA,FactoryB决定实例化具体的功能类,而不是想简单工厂中那样直接在工厂类Factory中决定。

     工厂方法代码如下:

代码
interface  IFactory   // 定义一个工厂接口
{
  Function CreateFunction(); 
// 工厂接口的功能:产生功能类
}
class  FactoryA:IFactory  
{
  
public   override  CreateFunction()
  {
    
return   new  FunctionA();
  }
}
class  FactoryB:IFactory  
{
  
public   override  CreateFunction()
  {
    
return   new  FunctionB();
  }
}
// 去掉原来的工厂类
public  calss Function
{
   
public   virtual   void  DoSomething()
   {
     .... ....
   }
}
public   class  FunctionA:Function
{
 
public   void   override  DoSomething()
 {
   .... ...
 }
}
public  calss FuctionB:Function
{
  
public   void   override  DoSomething()
  {
    .... ....
  }
}
public   static   void  main()
{
  IFactory ifactory
  =   new  FactoryA();       // 根据要实例化的功能类选择工厂类
  FunctionA fa  =   ifactory .CreateFunction(); // 工厂类实例化具体的功能类
  fa.DoSomething(); 
}

    简单工厂类也可以实现这样的功能,就是要修改原来的Factory类,在工厂方法模式里面要添加一个功能,需要扩展一个FuctionB:Function,还要扩展一个FactoryB:IFactory,避免了修改,开放了扩展。

你可能感兴趣的:(工厂方法)