首页 > 代码库 > 工厂方法模式

工厂方法模式

      工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。

由简单工厂模式的演化及区别:
      简单工厂模式最大的优点是工厂类中包含了必要的逻辑判断,根据客户端的选择动态的实例化
相关的类,对于客户端来说去除了对具体产品的依赖。但是,当我们需要给工厂模式增加功能时,我们需要在工厂类的方法里添加“case"语句,这就需要修改原有的类,这样一来,我们就违背了开-闭原则。

       我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建产品的工厂方法,所有要生产类的工厂就去实现这个接口。当需要增加功能时,只需要增加功能类和相应的工厂类就可以了。

  这样整个工厂和产品体系都没有修改的变化,而只是扩展的变化,这完全符合了开放封闭原则的精神。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现产品类,选择判断的问题还是存在的,也就是说,工厂方法模式把简单工厂的内部逻辑判断转移到客户端代码实现,你想要增加功能,本来是要修改工厂类,而现在是修改客户端。
     工厂方法模式克服了简单工厂违背开闭原则的缺点,同时又保持了封装对象创建过程的优点。

代码:
//FactoryMethod.h
#include "stdafx.h"
#include <memory>
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 <Method > Produce() = 0;
};

class AddFactory :public Factory
{
public :
        virtual shared_ptr <Method > Produce()
       {
               return shared_ptr <Method >(new AddMethod ());
       }
};

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

#include "stdafx.h"
#include "FactoryMethod.h"
#include <memory>
#include <iostream>
using namespace std;

int _tmain (int argc , _TCHAR * argv [])
{
        shared_ptr <Factory > pOperFactory( new AddFactory());
        shared_ptr <Method > pMethod = pOperFactory->Produce();
       pMethod->SetNum1(10);
       pMethod->SetNum2(2);
        int result = pMethod->Operator();
       cout << pMethod->GetNum1() << "+" << pMethod->GetNum2() << "=" << result << endl;
       
        shared_ptr <Factory > 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;
}