首页 > 代码库 > 工厂方法模式
工厂方法模式
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
由简单工厂模式的演化及区别:
简单工厂模式最大的优点是工厂类中包含了必要的逻辑判断,根据客户端的选择动态的实例化
相关的类,对于客户端来说去除了对具体产品的依赖。但是,当我们需要给工厂模式增加功能时,我们需要在工厂类的方法里添加“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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。