【14】c++设计模式——>工厂模式

简单工厂模式的弊端

简单工厂模式虽然简单,但是违反了设计模式中的开放封闭原则,即工厂类在数据增加时需要被修改,而我们在设计时对于已经设计好的类需要避免修改的操作,而选用扩展的方式。

工厂模式设计

简单工厂模式只有一个工厂类,而工厂模式是有一个基类,多个子类,基类中包含一个虚工厂函数,多个子类重写父类的工厂函数。每个子工厂类负责生产一种类,这相当于再次解耦,将工厂类再次拆分细化。

代码实例

cpp 复制代码
#include <iostream>
using namespace std;

//创建父类
class AbstructSmile
{
public:
	virtual void transform() = 0;
	virtual void ability() = 0;
	virtual ~AbstructSmile() {} //提供虚析构函数,为了能够释放子类对象
};

class sheepSmile : public AbstructSmile
{
public:
	void transform() override
	{
		cout << "山羊恶魔果实" << endl;
	}
	void ability() override
	{
		cout << "山羊能力" << endl;
	}
};

class lionSmile : public AbstructSmile
{
public:
	void transform() override
	{
		cout << "狮子恶魔果实" << endl;
	}
	void ability() override
	{
		cout << "狮子能力" << endl;
	}
};

class batSmile : public AbstructSmile
{
public:
	void transform() override
	{
		cout << "蝙蝠恶魔果实" << endl;
	}
	void ability() override
	{
		cout << "蝙蝠能力" << endl;
	}
};
enum class Type :char {SHEEP,LION,BAT};
//创建工厂类--->基类
class smileFactory
{
public:
	virtual ~smileFactory() {}
	virtual AbstructSmile* creatsmile() = 0;
};

class sheepFactory : public smileFactory
{
public:
	AbstructSmile* creatsmile() override
	{
		return new sheepSmile;
	} 
	~sheepFactory() 
	{
		cout << "sheepFactory 被析构了" << endl;
	}
};

class lionFactory : public smileFactory
{
public:
	AbstructSmile* creatsmile() override
	{
		return new lionSmile;
	}
	~lionFactory()
	{
		cout << "lionFactory 被析构了" << endl;
	}
};

class batFactory : public smileFactory
{
public:
	AbstructSmile* creatsmile() override
	{
		return new batSmile;
	}
	~batFactory()
	{
		cout << "batFactory 被析构了" << endl;
	}
};
int main()
{
	smileFactory* sheepPtr = new sheepFactory; 
	AbstructSmile* sheepObj = (AbstructSmile*)(sheepPtr->creatsmile());
	sheepObj->transform();
	sheepObj->ability();
	smileFactory* lionPtr = new lionFactory;
	AbstructSmile* lionObj = (AbstructSmile*)(lionPtr->creatsmile());
	lionObj->transform();
	lionObj->ability();
	smileFactory* batPtr = new batFactory;
	AbstructSmile* batObj = (AbstructSmile*)(batPtr->creatsmile());
	batObj->transform();
	batObj->ability();

	delete sheepObj;
	delete sheepPtr;

	delete lionObj;
	delete lionPtr;

	delete batObj;
	delete batPtr;


	return 0;
}

抽象类

抽象类不能直接构造对象,因为他是一种抽象的概念,没有具体的实现,如果想对象一个对象,需要创建一个继承自抽象类的具体类,并在该类中实现所有的纯虚函数,然后可以构造该具体类。

相关推荐
疯狂学习GIS2 分钟前
Windows配置VS Code详细流程
c++·学术工作效率
__BMGT()3 分钟前
C++ QT图片查看器
前端·c++·qt
关于不上作者榜就原神启动那件事15 分钟前
Java基础学习
java·开发语言·学习
Echo``20 分钟前
1:OpenCV—图像基础
c++·图像处理·人工智能·opencv·算法·计算机视觉·视觉检测
橙子1991101620 分钟前
在 Kotlin 中,什么是解构,如何使用?
android·开发语言·kotlin
Q_Q196328847536 分钟前
python的家教课程管理系统
开发语言·spring boot·python·django·flask·node.js·php
Black_Cat_yyds42 分钟前
设计杂谈-工厂模式
java·开发语言
进击的雷神1 小时前
Perl语言深度考查:从文本处理到正则表达式的全面掌握
开发语言·后端·scala
ALex_zry1 小时前
Ubuntu 20.04 C++开发环境搭建指南(2025版)
linux·c++·ubuntu
进击的雷神1 小时前
Perl测试起步:从零到精通的完整指南
开发语言·后端·scala