EoF的<設計模式_可複用面向對象軟件的基礎>
cbf4life的《24種設計模式介紹與6大設計原則》 http://cbf4life.iteye.com/
// class section
namespace Operation
{
class COperationBase
{
public:
COperationBase(void)
{
m_first_num = 0.0;
m_second_num = 0.0;
}
~COperationBase(void)
{
}
inline void SetFirstNum(const double a_first_num)
{
this->m_first_num = a_first_num;
}
inline void SetSecondNum(const double a_second_num)
{
this->m_second_num = a_second_num;
}
inline double GetFirstNum()
{
return this->m_first_num;
}
inline double GetSecondNum()
{
return this->m_second_num;
}
inline virtual const double GetResult() = 0;
private:
double m_first_num;
double m_second_num;
};
class CAddOperation : public COperationBase
{
public:
inline virtual const double GetResult()
{
DEBUG("CAddOperation");
return GetFirstNum() + GetSecondNum();
}
};
class CSubOperation : public COperationBase
{
public:
inline virtual const double GetResult()
{
DEBUG("CSubOperation");
return GetFirstNum() - GetSecondNum();
}
};
class CMulOperation : public COperationBase
{
public:
inline virtual const double GetResult()
{
DEBUG("CMulOperation");
return GetFirstNum() * GetSecondNum();
}
};
class CDivOperation : public COperationBase
{
public:
inline virtual const double GetResult()
{
DEBUG("CDivOperation");
if (0 == GetSecondNum())
{
DEBUG("Second num is 0.");
return -1;
}
return GetFirstNum() / GetSecondNum();
}
};
}
6.2.2 CalculatorFactory.h (計算器工廠類)
#include "OperationBase.h"
namespace Factory
{
class CCalculatorFactory
{
public:
CCalculatorFactory(void);
~CCalculatorFactory(void);
static Operation::COperationBase *Create(char a_operator);
};
}
6.2.3 CalculatorFactory.cpp(計算器工廠類實現)#include "CalculatorFactory.h"
Factory::CCalculatorFactory::CCalculatorFactory(void)
{
}
Factory::CCalculatorFactory::~CCalculatorFactory(void)
{
}
Operation::COperationBase* Factory::CCalculatorFactory::Create(char a_operator)
{
Operation::COperationBase *operation;
switch (a_operator)
{
case '+':
{
operation = new Operation::CAddOperation();
break;
}
case '-':
{
operation = new Operation::CSubOperation();
break;
}
case '*':
{
operation = new Operation::CMulOperation();
break;
}
case '/':
{
operation = new Operation::CDivOperation();
break;
}
default:
{
break;
}
}
return operation;
}
6.2.4 main
#include <iostream>
#include "OperationBase.h"
#include "CalculatorFactory.h"
int main(int argc, char **argv)
{
double first_num = 0;
double sec_num = 0;
char opertor = 0;
double ret = 0;
while(1)
{
fflush(stdin);
std::cin >> first_num >> opertor >> sec_num;
Operation::COperationBase *oper = Factory::CCalculatorFactory::Create(opertor);
if (NULL == oper)
{
break;
}
oper->SetFirstNum(first_num);
oper->SetSecondNum(sec_num);
std::cout << oper->GetResult() << std::endl;
if (NULL != oper)
{
delete(oper);
}
}
return 0;
}
6.3 簡單工廠UML類圖