C++设计模式之工厂方法模式详解(对比简单工厂)

      前面的文章详细介绍了单例模式简单工厂模式,有需要的可以点击链接去看看。之前说到,简单工厂模式有一个最大的弊端就是它违背了开放封闭原则,因为如果需要新增功能,则需要工厂类的内部,这违背了对修改关闭的设计原则。为了解决这个问题,工厂方法模式就诞生了。

     工厂方法:定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。通俗一点讲工厂方法和简单工厂的区别在于:简单工厂只有一个工厂类,且其中包含了所有可能的操作,根据传入参数的不同返回不同的对象,而工厂方法中,除了有一个工厂类(基类)之外,每个功能还存在一个派生类,客户可以根据自己的需求去实例化不同的对象。

#include<iostream>

using namespace std;
//工厂方法模式:定一个一个创建对象的接口,让子类决定实例化那一个类。工厂方法使一个类的实例化延迟到子类
//如果增加新的功能,则只需要增加该操作类和该操作的工厂类,这样全程就对修改关闭了

//操作类
class Operation {
private:
	int numberA;
	int numberB;//两个私有数据

public:
	//四个公有方法来设置和获取数据
	int getNumberA()
	{
		return numberA;
	}
	void setNumberA(int value)
	{
		numberA = value;
	}

	int getNumberB()
	{
		return numberB;
	}
	void setNumberB(int value)
	{
		numberB = value;
	}

	virtual int getresult() = 0;//纯虚函数
};

//加法类
class Add :public Operation {
public:
	int getresult()
	{
		return  getNumberA() + getNumberB();
	}
};

//减法类
class Sub :public Operation {
public:
	int getresult()
	{
		return  getNumberA() - getNumberB();
	}
};

//除法类
class Div :public Operation {
public:
	int getresult()
	{
		if (getNumberB() == 0)
		{
			cout << "除数不能为0" << endl;
			return 0;
		}
		return  getNumberA() / getNumberB();
	}
};

//乘法类
class Prod :public Operation {
public:
	int getresult()
	{
		return  getNumberA() * getNumberB();
	}
};


//工厂基类(简单工厂只有这一个工厂类,实例化也在该类中)
class Factoryoper {
public:
	virtual	Operation* createOperation() = 0;//纯虚函数
};

//工厂方法是需要哪个功能就实例化哪个对象,让客户去决定,派生出具体的功能类
//加法工厂
class addFactory :public Factoryoper {
public:
	Operation* createOperation()
	{
		return new Add();
	}
};

//减法工厂
class subFactory :public Factoryoper {
public:
	Operation* createOperation()
	{
		return new Sub();
	}
};

//除法工厂
class divFactory :public Factoryoper {
public:
	Operation* createOperation()
	{
		return new Div();
	}
};

//乘法工厂
class prodFactory :public Factoryoper {
public:
	Operation* createOperation()
	{
		return new Prod();
	}
};



int main()
{
	
	Factoryoper* operFactory1 = new addFactory();//加法工厂
	Operation* oper1 = operFactory1->createOperation();//加法实例
	oper1->setNumberA(10);
	oper1->setNumberB(20);
	int res = oper1->getresult();//得到结果
	cout << res << endl;

	Factoryoper* operFactory2 = new subFactory();
	Operation* oper2 = operFactory2->createOperation();
	oper2->setNumberA(10);
	oper2->setNumberB(20);
	cout << oper2->getresult()<< endl;

	Factoryoper* operFactory3 = new divFactory();
	Operation* oper3 = operFactory3->createOperation();
	oper3->setNumberA(60);
	oper3->setNumberB(3);
	cout << oper3->getresult() << endl;

	Factoryoper* operFactory4 = new prodFactory();
	Operation* oper4 = operFactory4->createOperation();
	oper4->setNumberA(60);
	oper4->setNumberB(3);
	cout << oper4->getresult() << endl;


	system("pause");
	return 0;
}

       代码中关键地方都注释了,相信大家也能看懂,欢迎交流讨论哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值