#include "stdafx.h"
#include <iostream>
using namespace std;
class Operation
{
public:
double GetNumA(){return m_numberA;}
double GetNumB(){return m_numberB;}
void SetNumA(double value){m_numberA = value;}
void SetNumB(double value){m_numberB = value;}
virtual double GetResult(){double result = 0; return result;}
private:
double m_numberA;
double m_numberB;
};
class OperationAdd : public Operation
{
virtual double GetResult()
{
double result = 0;
result = GetNumA() + GetNumB();
return result;
}
};
class OperationSub : public Operation
{
virtual double GetResult()
{
double result = 0;
result = GetNumA() - GetNumB();
return result;
}
};
class OperationMul : public Operation
{
virtual double GetResult()
{
double result = 0;
result = GetNumA() * GetNumB();
return result;
}
};
class OperationDiv : public Operation
{
virtual double GetResult()
{
double result = 0;
if (GetNumB() == 0)
{
}
result = GetNumA() / GetNumB();
return result;
}
};
// class OperationSqrt : public Operation
// {
// virtual double GetResult()
// {
// double result = 0;
// if ()
// {
// }
// }
// };
class OperationFactory
{
public:
static Operation* CreateOprate(char operate)
{
switch(operate)
{
case '+':
return new OperationAdd();
break;
case '-':
return new OperationSub();
break;
case '*':
return new OperationMul();
break;
case '/':
return new OperationDiv();
break;
}
return NULL;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
double NumA, NumB;
char operation;
cout<<"輸入A:";
cin>>NumA;
cout<<"輸入操作符:";
cin>>operation;
cout<<"輸入B:";
cin>>NumB;
Operation *Oper;
Oper = OperationFactory::CreateOprate(operation);
if (!Oper)
{
return 0;
}
Oper->SetNumA(NumA);
Oper->SetNumB(NumB);
cout<<"運算結果:"<<Oper->GetResult()<<endl;
delete Oper;
return 0;
}
適用性在下列情況下可以使用Factory Method模式:
• 當一個類不知道它所必須創建的對象的類的時候。
• 當一個類希望由它的子類來指定它所創建的對象的時候。
• 當類將創建對象的職責委託給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
參考《大話設計模式》