享元模式

首先来看一个情景,我们在写文档的时候,有很多的字,但是这些字难道真的一个一个独立的对像吗?如果真的是一个一个独立真实的对象,那么内存就会爆掉的。大家可能听说过字库,我们看到的字都是字库里面的,每个显示的字都是字库里面的,每个字在字库里只会有一个对象,那么就意味着文档里的相同的字都会指向同一个对象,这样的好处是什么呢?可以节省大量的资源。

享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。


Flyweight类,它是所有具体享元类的父类或接口,通过这个接口,Flyweight可以接受并作用于外部状态。
ConcreteFlyweight是继承Flyweight子类或实现Flyweight接口,并为内部状态增加存储空间。
UnsharedFlyweight是指那些不需要共享的Flyweight子类。因为Flyweight接口共享成为可能,但它并不强制共享。
FlyweightFactory,是一个享元工厂,它主要是用来确保合理的共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。
注意在这种模式中,客户端不在直接和元素交互,而是和工厂交互,即取字符的时候不是new一个字符出来,而是通过工厂里面的接口获取。
应用场景:如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时应该考虑使用该模式;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以使用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

#include<iostream>
#include<string>
#include<map>
using namespace std;
//模拟一个0-9数字字符库,
class Flyweight//所有字符的基类
{
public:
	virtual void Operation() = 0;//对字符的操作,至少要显示字符
	virtual ~Flyweight()
	{}
};
class ConcreteFlyweight : public Flyweight //具体的字符,0,1,2,3,4,5.。。。。
{
private:
	char ch;
public:
	ConcreteFlyweight(char _ch) :ch(_ch)
	{}
	void Operation()
	{
		cout << "char=" << ch << endl;
	}
};
class FlyweightFactory//一个字符生产工厂,取字符的地方
{
private:
	map<char, Flyweight*>m;//每一个字符都有唯一的对象
public:
	FlyweightFactory()
	{
		m.insert(make_pair('0', new ConcreteFlyweight('0')));//一开支字符库里面的字符
		m.insert(make_pair('1', new ConcreteFlyweight('1')));
		m.insert(make_pair('2', new ConcreteFlyweight('2')));
		m.insert(make_pair('3', new ConcreteFlyweight('3')));
	}
	Flyweight* GetFlyweight(char key)//获取字符
	{
		if (m.find(key) == m.end())//字符库里没有这个字符,就添加一个字符
		{
			m.insert(make_pair(key, new ConcreteFlyweight(key)));
		}
		return m[key];
	}
	int FlyweightCount()//字符数量的大小
	{
		return m.size();
	}
	~FlyweightFactory()
	{
		map<char, Flyweight*>::iterator p = m.begin();
		for (; p != m.end(); p++)
		{
			Flyweight *fp = p->second;
			delete fp;
		}
	}
};
int main()
{
	FlyweightFactory* f = new FlyweightFactory();
	Flyweight* f0 = f->GetFlyweight('0');
	f0->Operation();
	Flyweight* f1 = f->GetFlyweight('1');
	f1->Operation();
	Flyweight* f2 = f->GetFlyweight('2');
	f2->Operation();
	Flyweight* f5 = f->GetFlyweight('5');
	f5->Operation();
	Flyweight* f8 = f->GetFlyweight('8');
	f8->Operation();
	Flyweight* f00 = f->GetFlyweight('0');//虽然又需要一个0,但是两个0共享一个对象
	f00->Operation();
	cout << "字符库大小:" << f->FlyweightCount() << endl;
	delete f;
}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值