简单工厂模式的c++版本

研究了一下大话设计模式,顺手吧简单工厂模式的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值