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

抽象类

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

相关推荐
千千寰宇3 小时前
[设计模式/Java/多线程] 设计模式之单例模式【9】
设计模式·操作系统-进程/线程/并发
我不会编程55510 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
李少兄10 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
此木|西贝10 小时前
【设计模式】原型模式
java·设计模式·原型模式
懒羊羊大王&10 小时前
模版进阶(沉淀中)
c++
无名之逆10 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
似水এ᭄往昔10 小时前
【C语言】文件操作
c语言·开发语言
啊喜拔牙10 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
owde11 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
xixixin_11 小时前
为什么 js 对象中引用本地图片需要写 require 或 import
开发语言·前端·javascript