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

     在《简单工厂模式和策略模式的区别》中说道简单工厂中用一个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,避免了修改,开放了扩展。

作者:Tyler Ning
出处:http://www.cnblogs.com/tylerdonet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,请微信联系冬天里的一把火

原文地址:https://www.cnblogs.com/tylerdonet/p/1644423.html