码迷,mamicode.com
首页 > 其他好文 > 详细

工厂方法模式

时间:2014-05-21 16:14:07      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:c++ 设计模式

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

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

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

代码:
//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 ());
       }
};
// 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;
}




工厂方法模式,布布扣,bubuko.com

工厂方法模式

标签:c++ 设计模式

原文地址:http://blog.csdn.net/wwwdongzi/article/details/26377223

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!