设计模式之工厂模式
来源:互联网 发布:海康网络摄像机键盘 编辑:程序博客网 时间:2024/06/05 04:39
简单工厂模式
主要用于创建对象。新添加类时,不会影响以前的系统代码。其核心思想是:用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。
GOOD:适用于不同情况创建不同的类时。
BUG:客户端必须要知道基类和工厂类,耦合性差。
下面以加减乘除算法运算符为例。
#include <iostream>
//#include <math.h>
using namespace std;
//基类
class COperation
{
public:
COperation(double _a, double _b):m_nFirst(_a),m_nSecond(_b)
{}
double getFirst() { return m_nFirst; }
double getSecond() { return m_nSecond; }
virtual double GetResult()
{
double dResult=0.0;
return dResult;
}
private:
double m_nFirst;
double m_nSecond;
};
//加法
class AddOperation : public COperation
{
public:
AddOperation(double _a,double _b):COperation(_a,_b)
{}
public:
virtual double GetResult()
{
return this->getFirst()+this->getSecond();
}
};
//减法
class SubOperation : public COperation
{
public:
SubOperation(double _a,double _b):COperation(_a,_b)
{}
public:
virtual double GetResult()
{
return getFirst()-getSecond();
}
};
//乘法
class MulOperation : public COperation
{
public:
MulOperation(double _a,double _b):COperation(_a,_b)
{}
public:
virtual double GetResult()
{
return getFirst()*getSecond();
}
};
//除法
class DivOperation : public COperation
{
public:
DivOperation(double _a,double _b):COperation(_a,_b)
{}
public:
virtual double GetResult()
{
if(fabs(getSecond())<= 1e-7)
{
cout<<"the second number is meaningless,please check"<<endl;
return 0;
}
else
{
return getFirst()/getSecond();
}
}
};
//工厂类
class CCalculatorFactory
{
public:
static COperation* Create(double _a,double _b,char cOperator);
};
COperation* CCalculatorFactory:: Create(double _a,double _b,char cOperator)
{
COperation *oper;
//在C#中可以用反射来取消判断时用的switch,在C++中用什么呢?RTTI??
switch (cOperator)
{
case '+':
oper=new AddOperation(_a,_b);
break;
case '-':
oper=new SubOperation(_a,_b);
break;
case '*':
oper=new MulOperation(_a,_b);
break;
case '/':
oper = new DivOperation(_a,_b);
break;
default:
oper=new AddOperation(_a,_b);
break;
}
return oper;
}
int main()
{
double a,b;
char c;
cout<<"Please input a:"<<endl;
cin>>a;
cout<<"a="<<a<<endl;
cout<<"Please input b:"<<endl;
cin>>b;
cout<<"Please input operaton:"<<endl;
cin>>c;
COperation * op=CCalculatorFactory::Create(a,b,c);
cout<<op->GetResult()<<endl;
return 0;
}
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之---工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之-工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之 ------工厂模式
- 设计模式之工厂模式
- MFC:Ribbon界面设计
- Ubuntu14.04下Apache2+mod_jk+tomcat 配置Tomcat服务器集群负载均衡
- Linux 命令tail手动实现
- HDU 1040 As Easy As A+B
- php mygetype typeof 变量的数据类型
- 设计模式之工厂模式
- 利用nodejs+phantomjs+casperjs采集淘宝商品的价格
- 自行整理了一个较为准确的倒计时功能代码(js实现)
- Eddy's research I
- flash声音设置
- ceph存储 Linux-Futex浅析
- HTTP请求在网络中的详细过程
- 关于火车采集js调用文章资讯的方法 淘宝采集 相关
- 【LIS】【严格递增和非严格递增】