zoukankan      html  css  js  c++  java
  • 简单工厂和工厂方法的区别

         在《简单工厂模式和策略模式的区别》中说道简单工厂中用一个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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,请微信联系冬天里的一把火

  • 相关阅读:
    使用Vue初始化项目的时候,一直download template的解决方案
    移动端复选框和单选框选中样式不能正常显示
    PC端360浏览器如何打开手机模式
    我在项目中是这样配置Vue的
    怎么取消微信pc端“保持微信窗口在最前面”设置?
    5个 Vuex 插件,给你的下个VueJS项目
    Vue+Element前端导入导出Excel
    前端快来!最火的 Vue.js 开源项目出炉
    1月12日学习日志
    1月9日学习日志
  • 原文地址:https://www.cnblogs.com/tylerdonet/p/1644423.html
Copyright © 2011-2022 走看看