工厂模式

     接着上文简单工厂模式的问题,简单工厂模式的最大优点是工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。比如你想产生加操作,直接把加号给工厂,工厂就产生了加类的产品。但是如果要添加新功能,比如求M数的N次方,就需要增加case分支,因此就违背了开放-封闭原则。
什么叫开放封闭原则呢?开放:也就是该模块的行为是能够被扩展的,当应用程序的需求发生变化时,我们可以使模块便显出全新的或与以往不同的行为,满足新的需求。封闭:
模块的源代码是不能被侵犯的,任何人都不能修改已有的源代码。
基于此怎么来改进呢?方法就是将工厂变为抽象工厂,预留一个接口,这个接口就是产生一个operation类,所有的具体产生相应方法的类继承自该工厂实现该接口,这样就可以在不改动源代码的情况下,增加新的功能。

因此工厂方法模式的核心是:核心工厂类不再负责具体产品的创建,而是将创建工作交给相应的子类,核心工厂只提供接口。

#include <iostream>
#include <string>
using namespace std;

class Operation//基类存放数据,派生类实现操作,实现数据和操作分离
{
public:
	double A, B;
	virtual double  getResult()//无论是加减乘除还是别的,都是为了实现结果
	{
		return 0;
	}
	virtual ~Operation()
	{
	}
};
class AddOperation :public Operation
{
public:
	double getResult()
	{
		return A + B;
	}
};
class SubOperation :public Operation
{
public:
	double getResult()
	{
		return A - B;
	}
};
class MulOperation :public Operation
{
public:
	double getResult()
	{
		return A * B;
	}
};
class DivOperation :public Operation
{
public:
	double getResult()
	{
		if (abs(B) < 1.0e-8)
		{
			cout << "error" << endl;
			return 0;
		}
		else
		{
			return A / B;
		}
	}
};
class IFactory//抽象的工厂,负责生产操作的类
{
public:
	virtual Operation* createoperator() = 0;//接口
	virtual ~IFactory()
	{}
};
class AddIFactory:public IFactory
{
public:
	static Operation* createoperator()
	{
		return new AddOperation();
	}
};
class SubIFactory :public IFactory
{
public:
	static Operation* createoperator()
	{
		return new SubOperation();
	}
};
class MulIFactory :public IFactory
{
public:
	static Operation* createoperator()
	{
		return new MulOperation();
	}
};
class DivIFactory :public IFactory
{
public:
	static Operation* createoperator()
	{
		return new DivOperation();
	}
};
int main()
{
	Operation* op = AddIFactory::createoperator();
	op->A = 10;
	op->B = 20;
	cout << op->getResult() << endl;
	delete op;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值