工厂方法是在简单工厂模式的基础上改进的,它拥有简单工厂的功能。简单工厂模式违背 了“开放-封闭”原则,但他也有一个缺点,每需要创建一个新的产品时,系统需要添加两个类。
还是沿用上一个计算器的例子:
用visio画了一个丑丑的工厂模式的类图:
示例代码
operator
#ifndef __OPRATOR_H
#define __OPRATOR_H
template <class T>
class COperator
{
public:
COperator(void){};
virtual ~COperator(void){};
virtual T GetResult(T NumberA,T NumberB);
};
#endif
#include "Operator.h"
template <class T>
T COperator<T>::GetResult(T NumberA,T NumberB)
{
T result=0;
return result;
}
加法
#pragma once
#include "Operator.h"
template <class T>
class CAddOperator:public COperator<T>
{
public:
CAddOperator(void){};
~CAddOperator(void){};
virtual T GetResult(T NumberA,T NumberB);
};
#include "AddOperator.h"
template <class T>
T CAddOperator<T>::GetResult(T NumberA,T NumberB)
{
T result;
result = NumberA + NumberB;
return result;
}
减法
#pragma once
#include "operator.h"
template <class T>
class CSubOperator :public COperator<T>
{
public:
CSubOperator(void){};
~CSubOperator(void){};
virtual T GetResult(T NumberA,T NumberB);
};
#include "SubOperator.h"
template <class T>
T CSubOperator<T>::GetResult(T NumberA,T NumberB)
{
T result= NumberA -NumberB ;
return result;
}
乘法
#pragma once
#include "operator.h"
template <class T>
class CMulOperator :public COperator<T>
{
public:
CMulOperator(void){};
~CMulOperator(void){};
virtual T GetResult(T NumberA,T NumberB);
};
#include "Mul.h"
template <class T>
T CMulOperator<T>::GetResult(T NumberA,T NumberB)
{
T result = NumberA * NumberB;
return result;
}
除法
#pragma once
#include "operator.h"
template <class T>
class CDivOperator :public COperator<T>
{
public:
CDivOperator(void){};
~CDivOperator(void){};
virtual T GetResult(T NumberA,T NumberB);
};
#include "Div.h"
#include <assert.h>
template <class T>
T CDivOperator<T>::GetResult(T NumberA,T NumberB)
{
assert( NumberB != 0);
T result = NumberA/NumberB;
return result;
}
接下来是工厂类
#pragma once
#include "Operator.h"
template <class T>
class CFactory
{
public:
virtual ~CFactory(){};
virtual COperator<T>* CreateOperaor();
};
#include "Factory.h"
template <class T>
virtual COperator<T>* CFactory<T>::CreateOperaor()
{
COperator<T>* pOpe=new COperator<T>;
return pOpe;
}
加法工厂类
#pragma once
#include "Factory.h"
template <class T>
class CAddFactory:public CFactory<T>
{
public:
virtual COperator<T>* CreateOperaor();
};
#include "AddFacory.h"
template <class T>
virtual COperator<T>* CAddFactory<T>::CreateOperaor()
{
COperator<T>* pOpe=new CAddOperator<T>;
return pOpe;
}
减法工厂类
#pragma once
#include "Factory.h"
template <class T>
class CSubFactory:public CFactory<T>
{
public:
virtual COperator<T>* CreateOperaor();
};
#include "SubFactory.h"
template <class T>
virtual COperator<T>* CSubFactory<T>::CreateOperaor()
{
COperator<T>* pOpe=new CSubOperator<T>;
return pOpe;
}
乘法工厂类
#pragma once
#include "Operator.h"
template <class T>
class CMulFactory:public CFactory<T>
{
virtual COperator<T>* CreateOperaor();
};
#include "MulFactory.h"
template <class T>
virtual COperator<T*> CMulFactory<T>::CreateOperaor()
{
COperator<T>* pOpe=new CMulOperator<T>;
return pOpe;
}
除法工厂类
#pragma once
#include "Operator.h"
template <class T>
class CDivFactory:public CFactory<T>
{
public:
virtual COperator<T>* CreateOperaor();
};
#include "DivFactory.h"
template <class T>
virtual COperator<T>* CDivFactory<T>::CreateOperaor()
{
COperator<T>* pOpe = new CDivOperator<T>;
return pOpe;
}
客户端代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
void main()
{
CFactory<double>* pFac=NULL;
COperator<double>* pOpe=NULL;
cout<<"创建加法\n";
pFac=new CAddFactory<double>;
pOpe=pFac->CreateOperaor();
cout<<"2+3 ="<<pOpe->GetResult(2,3)<<endl;
delete pFac;
delete pOpe;
cout<<"创建减法\n";
pFac=new CSubFactory<double>;
pOpe=pFac->CreateOperaor();
cout<<"2-3 ="<<pOpe->GetResult(2,3)<<endl;
delete pFac;
delete pOpe;
cout<<"创建乘法\n";
pFac=new CMulFactory<double>;
pOpe=pFac->CreateOperaor();
cout<<"2*3 ="<<pOpe->GetResult(2,3)<<endl;
delete pFac;
delete pOpe;
cout<<"创建除法\n";
pFac=new CDivFactory<double>;
pOpe=pFac->CreateOperaor();
cout<<"2/3 ="<<pOpe->GetResult(2,3)<<endl;
delete pFac;
delete pOpe;
}
用代码诠释一切~