关闭

C++ 08工厂方法模式

标签: 工厂方法模式C++设计模式
150人阅读 评论(0) 收藏 举报
分类:

工厂方法模式(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:30973次
    • 积分:589
    • 等级:
    • 排名:千里之外
    • 原创:26篇
    • 转载:11篇
    • 译文:0篇
    • 评论:10条
    最新评论