研究了一下大话设计模式,顺手吧简单工厂模式的c++版本写出来了,放上来分享一下
/*简单工厂模式
*by clh01s@163.com 2017年7月11日
*/
#include <iostream>
#include <string>
using namespace std;
//基础操作类,加法类,减法类,乘法类,除法类的父类
class Operation
{
public:
double get_num_a(){return _number_a;}
double get_num_b(){return _number_b;}
void set_num_a(double a){_number_a = a;}
void set_num_b(double b){_number_b = b;}
//虚函数
virtual double GetResult()
{
double result = 0;
return result;
}
private:
double _number_a;
double _number_b;
};
//加法类
class OperationAdd:public Operation
{
public:
//重写虚函数GetResult
double GetResult() override
{
double result = get_num_a() + get_num_b();
return result;
}
};
//减法类
class OperationSub:public Operation
{
public:
//重写虚函数GetResult
double GetResult() override
{
double result = get_num_a() - get_num_b();
return result;
}
};
//乘法类
class OperationMul:public Operation
{
public:
//重写虚函数GetResult
double GetResult() override
{
double result = get_num_a() * get_num_b();
return result;
}
};
class OperationDiv:public Operation
{
public:
//重写虚函数GetResult
double GetResult() override
{
if(0 == get_num_b())
{
//除数不能为0
return -1;
}
double result = get_num_a() / get_num_b();
return result;
}
};
//工厂类,根据运算符的不同创造不同的实例
class OperationFactory
{
public:
//将运算符转换成switch可以识别的int类型
int transform(string oper)
{
if("+" == oper)
{
return 0;
}else if("-" == oper)
{
return 1;
}else if("*" == oper)
{
return 2;
}else
{
return 3;
}
}
//创建实例函数,根据操作符返回相应的操作Operation类的指针
Operation *createOperate(string operate)
{
Operation *oper;
switch(transform(operate))
{
case 0:
oper = new OperationAdd();
break;
case 1:
oper = new OperationSub();
break;
case 2:
oper = new OperationMul();
break;
case 3:
oper = new OperationDiv();
break;
}
return oper;
}
};
int main()
{
//创建一个运算类的指针
Operation *oper;
//创建一个工厂类的实例
OperationFactory create;
//接受工厂类返回的不同操作类的地址
oper = create.createOperate("+");
//设置两个数
oper->set_num_a(9.154);
oper->set_num_b(11.3);
//完成运算
double result = oper->GetResult();
cout<<"9.154+11.3="<<result<<endl;
return 0;
}
结果输出
$ g++ factory.cpp -std=c++11
$ ./a.out
9.154+11.3=20.454
工厂模式的优缺点(摘自《设计模式》):
优点:
1.它分离了具体的类,将客户与类的实现分离.产品类名也在具体的工厂的实现中被分离;它们不会出现在客户代码中.
2.它使得易于交换产品系列.一个具体的工厂类在应用中仅出现一次即它初始化的时候.这使得改变一个类变得很容易.
3.有利于产品的一致性.当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要.
缺点:
1.难以支持新种类产品.难以扩展抽象工厂以生产新种类的产品.因为工厂类的接口确定了可以被创建的产品集合.支持新种类的产品就需要扩充该工厂的接口.这将涉及工厂类及其所有子类的改变.
转载请注明出处:http://blog.youkuaiyun.com/clh01s/article/details/74991526