C++ 08工厂方法模式

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。


下面还是举例怎样设计一个计算器。

结构图如下:

请自觉的比较 简单工厂模式和工厂方法模式的异同。


直接上代码:

#include<iostream>
#include<string>

using namespace std;

//抽象运算类
class Operation
{
private:
	double numberA = 0;
	double numberB = 0;
public:
	double getNumberA()
	{
		return numberA;
	}
	void setNumberA(double _numberA)
	{
		numberA = _numberA;
	}
	double getNumberB()
	{
		return numberB;
	}
	void setNumberB(double _numberB)
	{
		numberB = _numberB;
	}

	virtual double getResult() = 0
	{
		double result = 0;
		return result;
	}
};

//加法类
class OperationAdd :public Operation
{
public:
	double getResult()
	{
		double result = 0;
		result = getNumberA() + getNumberB();
		return result;
	}
};

//减法类
class OperationSub :public Operation
{
public:
	double getResult()
	{
		double result = 0;
		result = getNumberA() - getNumberB();
		return result;
	}
};

//乘法类
class OperationMul :public Operation
{
public:
	double getResult()
	{
		double result = 0;
		result = getNumberA() * getNumberB();
		return result;
	}
};

//除法类
class OperationDiv :public Operation
{
public:
	double getResult()
	{
		double result = 0;
		if (this->getNumberB() == 0)
		{
			cout << "除数不能为0" << endl;
			return 0;
		}
		result = getNumberA() / getNumberB();
		return result;
	}
};

//工厂接口类
class IFactory
{
public:
	virtual Operation* createOperation()=0;
};

//加法工厂类
class AddFactory : public IFactory
{
public:
	 Operation* createOperation()
	{
		return new OperationAdd();
	}
};
//减法工厂类
class SubFactory : public IFactory
{
public:
	Operation* createOperation()
	{
		return new OperationSub();
	}
};
//乘法工厂类
class MulFactory : public IFactory
{
public:
	Operation* createOperation()
	{
		return new OperationMul();
	}
};
//除法工厂类
class DivFactory : public IFactory
{
public:
	Operation* createOperation()
	{
		return new OperationDiv();
	}
};


//客户端代码
int main()
{
	IFactory* operFactory = new DivFactory();
	Operation * oper = operFactory->createOperation();
	oper->setNumberA(1);
	oper->setNumberB(2);
	double result = oper->getResult();
	cout << "result="<< result << endl;
}

用工厂方法模式实现的计算器,当再扩展其他新功能时,不需要修改其他原有的代码,只需要扩展新的功能类和具体的工厂类,此模式不像简单方法模式需要修改工厂类中的逻辑判断。

这样整个工厂和产品体系其实都没有修改的变化,而只是扩展的变化,这完全符合了开放-封闭原则的精神。

另外,工厂模式实现时,客户端需要决定实例化哪个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想加新功能,本来是修改工厂类的,而现在是要修改客户端。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值