享元模式

享元模式(Flyweight)

运用共享技术有效地支持大量细粒度的对象.

优点

大大减少对象的创建,避免了大量重复的对象的出现,减轻系统的内存负担,使效率提高.

缺点

需要考虑外部状态和内部状态的划分,否则将使得线程不安全.

理解

这里将会用到"池"的概念,创建对象之前将会搜索池,如果不存在可用对象,则会创建新对象并将其加入"池",否则将会使用已经存在的对象,此时新的对象事实上可以看成已经存在的对象的引用.
一篇文章中有很多字,字体往往有区别,如果每个字都创建一个对象的话,将会带来大量的负担.

实现

在创建的对象池中,已经存在的对象是稳定的,将要创建的对象是变化的.
在这里插入图片描述

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

class FlyWeight {
public:
	FlyWeight(const string& words) { m_words = words; }
	void getWords(){ cout << m_words << endl; }
private:
	string m_words;
};

class FlyWeightFactory {
public:
	FlyWeight* getObject(const string words) {
		map<string, FlyWeight*>::iterator iter = m_pool.find(words);
		if (iter != m_pool.end()) {
			cout << "发现可用对象,使用" << endl;
			return m_pool[words];
		}
		else {
			cout << "未发现可用对象,创建" << endl;
			FlyWeight* flyWeight = new FlyWeight(words);
			m_pool[words] = flyWeight;
			return flyWeight;
		}
	}
private:
	map<string, FlyWeight*> m_pool;
};

int main(void) {
	FlyWeightFactory* factory = new FlyWeightFactory;

	FlyWeight* object1 = factory->getObject("微软雅黑");
	FlyWeight* object2 = factory->getObject("黑体");

	FlyWeight* object3 = factory->getObject("微软雅黑");

	object1->getWords();
	object2->getWords();
	object3->getWords();

	cout << "object1的地址:" << object1 << "\n" << "object3的地址:" << object3 << endl;

	system("pause");
	return 0;
}

在这里插入图片描述
可以看出,object1和object3指向同一个对象.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值