工廠模式專門負責將大量有共同接口的類實例化。工廠模式可以動態決定將哪一個類實例化,不必事先知道每次要實例化哪一個類。工廠模式有以下幾種形態:
簡單工廠(Simple Factory)模式
工廠方法(Factory Method)模式
抽象工廠(Abstract Factory)模式
意圖
定義一個用戶創建對象的接口,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。
工廠模式就是根據用戶的需求調用響應的函數而產生的類。
工廠類角色Creator (LightSimpleFactory):工廠類在客戶端的直接控制下(Create方法)創建產品對象。
抽象產品角色Product (Light):定義簡單工廠創建的對象的父類或它們共同擁有的接口。可以是一個類、抽象類或接口。
具體產品角色ConcreteProduct (BulbLight, TubeLight):定義工廠具體加工出的對象
源碼
// tttt5.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include <exception>
#include <string>
#include <iostream>
using namespace std;
#ifndef AFX_CLASS_OPERATION
#define AFX_CLASS_OPERATION
template <class T>
class Operation
{
public:
virtual T GetResult()
{
T result = 0;
return result;
}
virtual Operation& operator =(const Operation &A)
{
return *this;
}
public:
T _numberA;
T _numberB;
};
//加法
template <class T>
class OperationAdd:public Operation<T>
{
public:
virtual T GetResult()
{
T result = 0;
result = _numberA + _numberB;
return result;
}
};
//減法
template <class T>
class OperationSub:public Operation<T>
{
public:
virtual T GetResult()
{
T result = 0;
result = _numberA - _numberB;
return result;
}
};
//乘法
template <class T>
class OperationMul:public Operation<T>
{
public:
virtual T GetResult()
{
int result = 0;
result = _numberA * _numberB;
return result;
}
};
//除法
template <class T>
class OperationDiv:public Operation<T>
{
public:
virtual T GetResult()
{
T result = 0;
if(_numberB == 0)
{
throw 1001;
}
result = _numberA / _numberB;
return result;
}
};
#endif
//類工廠
#ifndef AFX_CLASS_OPERATIONFACTORY
#define AFX_CLASS_OPERATIONFACTORY
template <class T>
class OperationFactory
{
public:
static Operation<T>* CreateOperate(string operate)
{
Operation<T> *oper=NULL;
if(!operate.compare("+"))
oper = new OperationAdd<T>;
if(!operate.compare("-"))
oper = new OperationSub<T>;
if(!operate.compare("*"))
oper = new OperationMul<T>;
if(!operate.compare("/"))
oper = new OperationDiv<T>;
return oper;
}
};
#endif
int main(void)
{
Operation<int> *oper = NULL;
oper = OperationFactory<int>::CreateOperate("+");
oper->_numberA = 1;
oper->_numberB = 2;
cout<<oper->GetResult()<<endl;
getchar();
return 0;
}