zl程序教程

您现在的位置是:首页 >  后端

当前栏目

工厂方法模式

方法模式 工厂
2023-09-14 09:12:43 时间

    看到这,我认为你已经看过上节的简单工厂模式了,那么这节对你来说将很easy~~~,只需要了解开闭原则的概念即可。

    工厂方法模式是对简单工厂模式的一种改进,因为在简单工厂模式违反了开闭原则,如果你想新生产一个产品,需要修改工厂内的方法。而开闭原则告诉我们,如果要增加新功能,尽量用增加代码而不是修改代码的方式,这样会减少对其他功能的错误修改。场景:相对于简单工厂,现在把工厂也抽象为一个抽象类,然后派生子类,想新生产一个产品就派上一个新类,让它来完成对产品的new实例化,这就符合开闭原则。其他无异于简单工厂模式。

    这些代码都是在学习这些的过程中码的。。。。。

上代码,亲测有效!

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

//简单工厂模式缺点:违反开闭原则,当需要增加新种类处理器
//如CoreC时,需要修改Factory类的方法,而不是直接添加模块

enum TYPE
{
	COREA,
	COREB
};

//处理器基类
class Core
{
public:
	virtual void show() = 0;
};

//处理器子类CoreA
class CoreA : public Core
{
public:
	void show()
	{
		cout << "CoreA" << endl;
	}
};

//处理器子类CoreB
class CoreB : public Core
{
public:
	void show()
	{
		cout << "CoreB" << endl;
	}
};

//工厂基类
class Factory
{
public:
	virtual Core* Product() = 0;
};

//工厂子类,用于生产CoreA
class FactoryA : public Factory
{
public: 
	CoreA* Product()
	{
		return new CoreA;
	}
};

//工厂子类,用于生产CoreB
//此时要增加新产品,直接定义类FactoryC
class FactoryB : public Factory
{
public:
	CoreB* Product()
	{
		return new CoreB;
	}
};

int main(void)
{
	//要生产CoreA,实例化A工厂
	Factory* factA = new FactoryA;
	//用A工厂生产CoreA
	Core* core = factA->Product();
	//验证工厂是否生产出CoreA
	core->show();

	//要生产CoreB,实例化B工厂
	Factory* factB = new FactoryB;
	//用工程B生产CoreB
	core = factB->Product();
	//验证是否生产出CoreB
	core->show();

	//释放factA,factB,及core
	delete factA;
	delete factB;
	delete core;
	system("pause");
	return 0;
}