工厂方法模式属于创建型的设计模式,把简单工厂模式中的工厂类,做了进一步的抽象为接口或抽象类,给各个功能创建一个对应的工厂类,然后在这个工厂类里面去创建对应的实例。 优点:满足开放-封闭原则 缺点:当新增一个功能类,就需要创建对于的工厂类,相比简单工厂模式,免去了判断创建那个具体实例,但会创建过多的类,还不如策略模式。
此处利用”+”,”-“,”*”,”/”这4个Operation来生成不同的Operation对象来说明工厂方法模式,注意与简单工厂模式的区别。
文件构成: —include ——Operation.h ——Add.h ——Subtraction.h ——Multiply.h ——Division.h ——OperationFactory.h ——AddFactory.h ——SubtractionFactory.h ——MultiplyFactory.h ——DivisionFactory.h —src ——Add.cpp ——Subtraction.cpp ——Multiply.cpp ——Division.cpp ——AddFactory.cpp ——SubtractionFactory.cpp ——MultiplyFactory.cpp ——DivisionFactory.cpp
代码如下: —include/Operation.h
#ifndef _OPERATION_H_#define _OPERATION_H_class Operation{public: virtual double GetResult(double A, double B)=0;};#endif—include/Add.h
#ifndef _ADD_H_#define _ADD_H_#include"Operation.h"class Add:public Operation{public: double GetResult(double A, double B);};#endif—include/Subtraction.h
#ifndef _SUBTRACTION_H_#define _SUBTRACTION_H_#include"Operation.h"class Subtraction:public Operation{public: double GetResult(double A, double B);};#endif—include/Multiply.h
#ifndef _MULTIPLY_H_#define _MULTIPLY_H_#include"Operation.h"class Multiply:public Operation{public: double GetResult(double A, double B);};#endif—include/Division.h
#ifndef _DIVISION_H_#define _DIVISION_H_#include"Operation.h"class Division:public Operation{public: double GetResult(double A, double B);};#endif—include/OperationFactory.h
#ifndef _OPERATIONFACTORY_H_#define _OPERATIONFACTORY_H_#include"Operation.h"class OperationFactory{public: virtual Operation* CreateInstance()=0;};#endif—include/AddFactory.h
#ifndef _ADDFACTORY_H_#define _ADDFACTORY_H_#include"OperationFactory.h"class AddFactory:public OperationFactory{public: Operation* CreateInstance();};#endif—include/SubtractionFactory.h
#ifndef _SUBTRACTIONFACTORY_H_#define _SUBTRACTIONFACTORY_H_#include"OperationFactory.h"class SubtractionFactory:public OperationFactory{public: Operation* CreateInstance();};#endif—include/MultiplyFactory.h
#ifndef _MULTIPLYFACTORY_H_#define _MULTIPLYFACTORY_H_#include"OperationFactory.h"class MultiplyFactory:public OperationFactory{public: Operation* CreateInstance();};#endif—include/DivisionFactory.h
#ifndef _DIVISIONFACTORY_H_#define _DIVISIONFACTORY_H_#include"OperationFactory.h"class DivisionFactory:public OperationFactory{public: Operation* CreateInstance();};#endif—src/Add.cpp
#include"Add.h"double Add::GetResult(double A, double B){ return A+B;}—src/Subtraction.cpp
#include"Subtraction.h"double Subtraction::GetResult(double A, double B){ return A-B;}—src/Multiply.cpp
#include"Multiply.h"double Multiply::GetResult(double A, double B){ return A*B;}—src/Division.cpp
#include"Division.h"double Division::GetResult(double A, double B){ return A-B;}—src/AddFactory.cpp
#include"AddFactory.h"#include"Add.h"Operation* AddFactory::CreateInstance(){ return new Add();}—src/SubtractionFactory.cpp
#include"SubtractionFactory.h"#include"Subtraction.h"Operation* SubtractionFactory::CreateInstance(){ return new Subtraction();}—src/MultiplyFactory.cpp
#include"MultiplyFactory.h"#include"Multiply.h"Operation* MultiplyFactory::CreateInstance(){ return new Multiply();}—src/DivisionFactory.cpp
#include<iostream>#include"AddFactory.h"#include"SubtractionFactory.h"#include"MultiplyFactory.h"#include"DivisionFactory.h"using namespace std;int main(){ double value1=10; double value2=2; OperationFactory* addFac=new AddFactory(); Operation* add=addFac->CreateInstance(); OperationFactory* subFac=new SubtractionFactory(); Operation* sub=subFac->CreateInstance(); OperationFactory* mulFac=new MultiplyFactory(); Operation* mul=mulFac->CreateInstance(); OperationFactory* divFac=new DivisionFactory(); Operation* div=divFac->CreateInstance(); cout<<"Add Operation: "<<"value1: "<<value1<<" "<<"value2: "<<value2<<" "<<"ans: "<<add->GetResult(value1,value2)<<endl; cout<<"Subtraction Operation: "<<"value1: "<<value1<<" "<<"value2: "<<value2<<" "<<"ans: "<<sub->GetResult(value1,value2)<<endl; cout<<"Multiply Operation: "<<"value1: "<<value1<<" "<<"value2: "<<value2<<" "<<"ans: "<<mul->GetResult(value1,value2)<<endl; cout<<"Division Operation: "<<"value1: "<<value1<<" "<<"value2: "<<value2<<" "<<"ans: "<<div->GetResult(value1,value2)<<endl; delete add; delete addFac; delete sub; delete subFac; delete mul; delete mulFac; delete div; delete divFac; return 0;}文件构成: —Operation.py —OperationFactory.py 代码如下: —Operation.py
# -*- coding:utf-8 -*-class Operation(): def GetResult(self, A, B): passclass Add(Operation): def GetResult(self, A, B): return A + Bclass Subtraction(Operation): def GetResult(self, A, B): return A - B class Multiply(Operation): def GetResult(self, A, B): return A * Bclass Division(Operation): def GetResult(self, A, B): return A / B—OperationFactory.py
# -*- coding:utf-8 -*-from Operation import *class OperationFactory(): def CreateInstance(self): passclass AddFactory(OperationFactory): def CreateInstance(self): return Add()class SubtractionFactory(OperationFactory): def CreateInstance(self): return Subtraction()class MultiplyFactory(OperationFactory): def CreateInstance(self): return Multiply()class DivisionFactory(OperationFactory): def CreateInstance(self): return Division()if "__main__" == __name__: addFac = AddFactory() addOp = addFac.CreateInstance() subFac = SubtractionFactory() subOp = subFac.CreateInstance() mulFac = MultiplyFactory() mulOp = mulFac.CreateInstance() divFac = DivisionFactory() divOp = divFac.CreateInstance() value1 = 10. value2 = 2. PRint "Add Operation: value1: %f value2: %f ans: %f" %(value1, value2, addOp.GetResult(value1, value2)) print "Subtraction Operation: value1: %f value2: %f ans: %f" %(value1, value2, subOp.GetResult(value1, value2)) print "Multiply Operation: value1: %f value2: %f ans: %f" %(value1, value2, mulOp.GetResult(value1, value2)) print "Division Operation: value1: %f value2: %f ans: %f" %(value1, value2, divOp.GetResult(value1, value2))新闻热点
疑难解答