【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;
}

抽象类

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

相关推荐
超绝振刀怪几秒前
【C++可变模板参数】
开发语言·c++·可变模板参数
Freak嵌入式11 分钟前
MicroPython LVGL基础知识和概念:时序与动态效果
开发语言·python·github·php·gui·lvgl·micropython
2501_9333295540 分钟前
企业媒体发布与舆情管理实战:Infoseek舆情系统技术架构与落地解析
大数据·开发语言·人工智能·数据库开发
"菠萝"43 分钟前
C#知识学习-021(文字关键字)
开发语言·学习·c#
minji...43 分钟前
Linux 线程同步与互斥(二) 线程同步,条件变量,pthread_cond_init/wait/signal/broadcast
linux·运维·开发语言·jvm·数据结构·c++
zhangzeyuaaa1 小时前
Python 中的 Map 和 Reduce 详解
开发语言·python
梓䈑1 小时前
高性能 C++ 日志实战:spdlog 核心架构解析与最佳实践指南
c++·架构
qqxhb1 小时前
26|Agent 设计模式:ReAct、Plan-and-Solve 与反射
设计模式·react模式·plan-and-solve·reflection模式
游乐码1 小时前
c#HashTable
开发语言·c#