工厂方法模式

2014-11-23 20:20:07 · 作者: · 浏览: 17
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
由简单工厂模式的演化及区别: 简单工厂模式最大的优点是工厂类中包含了必要的逻辑判断,根据客户端的选择动态的实例化 相关的类,对于客户端来说去除了对具体产品的依赖。但是,当我们需要给工厂模式增加功能时,我们需要在工厂类的方法里添加“case"语句,这就需要修改原有的类,这样一来,我们就违背了开-闭原则。
\ 我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建产品的工厂方法,所有要生产类的工厂就去实现这个接口。当需要增加功能时,只需要增加功能类和相应的工厂类就可以了。 \
这样整个工厂和产品体系都没有修改的变化,而只是扩展的变化,这完全符合了开放封闭原则的精神。 工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现产品类,选择判断的问题还是存在的,也就是说,工厂方法模式把简单工厂的内部逻辑判断转移到客户端代码实现,你想要增加功能,本来是要修改工厂类,而现在是修改客户端。 工厂方法模式克服了简单工厂违背开闭原则的缺点,同时又保持了封装对象创建过程的优点。
代码: //FactoryMethod.h
#include "stdafx.h"
#include 
  
   
using namespace std;

class Method
{
private :
        int _Num1;
        int _Num2;
public :
       Method( int number1 = 0, int number2 = 0)
              :_Num1( number1), _Num2( number2)
       {}
        virtual ~Method()
       {}

        int GetNum1(){ return _Num1; }
        int GetNum2(){ return _Num2; }
        void SetNum1( int number1){ _Num1 = number1; }
        void SetNum2( int number2){ _Num2 = number2; }

        virtual int Operator() = 0;
};

class AddMethod :public Method
{
public :
       AddMethod( int number1 = 0, int number2 = 0) :
               Method( number1, number2)
       {}

        virtual int Operator()
       {
               return GetNum1() + GetNum2();
       }
};


class SubMethod :public Method
{
public :
       SubMethod( int number1 = 0, int number2 = 0) :
               Method( number1, number2)
       {}

        virtual int Operator()
       {
               return GetNum1() - GetNum2();
       }
};

class Factory
{
public :
        virtual shared_ptr 
   
     Produce() = 0; }; class AddFactory :public Factory { public : virtual shared_ptr 
    
      Produce() { return shared_ptr 
     
      (new AddMethod ()); } }; class SubFactory :public Factory { public : virtual shared_ptr 
      
        Produce() { return shared_ptr 
       
        (new SubMethod ()); } }; 
       
      
     
    
   
  
//FactoryMethodPattern.cpp
// FcatoryMethodPattern.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "FactoryMethod.h"
#include 
  
   
#include 
   
     using namespace std; int _tmain (int argc , _TCHAR * argv []) { shared_ptr 
    
      pOperFactory( new AddFactory()); shared_ptr 
     
       pMethod = pOperFactory->Produce(); pMethod->SetNum1(10); pMethod->SetNum2(2); int result = pMethod->Operator(); cout << pMethod->GetNum1() << "+" << pMethod->GetNum2() << "=" << result << endl; shared_ptr 
      
        pOperFactory2( new SubFactory()); pMethod = pOperFactory2->Produce(); pMethod->SetNum1(10); pMethod->SetNum2(2); result = pMethod->Operator(); cout << pMethod->GetNum1() << "-" << pMethod->GetNum2() << "=" << result << endl; getchar(); return 0; }