您的位置:首页 > 编程语言 > C语言/C++

设计模式C++版_1_简单工厂模式

2013-06-17 19:02 531 查看
本文是学习设计模式的学习笔记,文中引用了如下作者(书籍、博客)的内容,实例程序在《设计模式C++版》的基础上有所改动,特此声明。

Peixing Yang的《大话设计模式C++源代码》


程杰的《大话设计模式》
K_Eckel的《设计模式C++版》 http://k-eckel.cnblogs.com/
EoF的<设计模式_可复用面向对象软件的基础>

cbf4life的《24种设计模式介绍与6大设计原则》 http://cbf4life.iteye.com/


1. 应用场景
1.1 当有若干功能相似的类,各类之间并没有耦合,可以用简单工厂来实现这些类的实例化。当添加新的类的时候,不影响现有的代码。

1.2 父类并不知道具体要实例化哪一个具体的子类。
2. 功能
2.1 定义创建对象的接口,封装了对象的创建。
2.2 使得具体化类的工作延迟到了子类中。
3. 核心思想
用一个工厂来根据输入的条件来产生不同的类的对象,然后根据不同类的virtual函数得到不同的结果。

4. 优点
适用于不同情况创建不同类的对象时。

5. 缺点
客户端必须要知道基类和工厂类,耦合性差
6. 实例
设计一个计算器,要求可以进行简单的加减乘除运算。

6.1 设计类图





6.2 程序示例
6.2.1 OperationBase.h (各种运算类)
// 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类图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: