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

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

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

     代码如下:

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
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中决定。

     工厂方法代码如下:

img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过以下邮箱地址williamningdong@gmail.com  联系我,非常感谢。

目录
相关文章
|
6月前
|
设计模式 Java 数据库连接
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。那么三者有什么区别呢?
160 1
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
抽象工厂和工厂方法对比
抽象工厂和工厂方法对比
54 0
|
6月前
创建型 简单工厂(工厂方法)模式
创建型 简单工厂(工厂方法)模式
57 1
|
C++
工厂方法VS简单工厂
工厂方法VS简单工厂
50 0
|
设计模式
大话设计模式-三种工厂模式(简单工厂、工厂方法、抽象工厂)
大话设计模式-三种工厂模式(简单工厂、工厂方法、抽象工厂)
|
C# uml
C#简单工厂总结
C#简单工厂总结
45 0
|
设计模式 缓存 Java
简单工厂不简单
简单工厂不简单
简单工厂不简单
|
设计模式 C++
简单工厂VS工厂方法VS抽象工厂
简单工厂VS工厂方法VS抽象工厂
107 0
简单工厂VS工厂方法VS抽象工厂
简单工厂
《基础系列》
112 0
简单工厂
|
设计模式
设计模式 - 简单工厂(静态工厂)& 工厂方法(构建工厂)
设计模式 - 简单工厂(静态工厂)& 工厂方法(构建工厂)
99 0
设计模式 - 简单工厂(静态工厂)& 工厂方法(构建工厂)