享元模式

享元模式(Flyweight)

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

优点

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

缺点

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

理解

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

实现

在创建的对象池中,已经存在的对象是稳定的,将要创建的对象是变化的.
享元模式_第1张图片

#include 
#include 
#include 
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;
}

享元模式_第2张图片
可以看出,object1和object3指向同一个对象.

你可能感兴趣的:(设计模式,C++,设计模式)