享元模式(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指向同一个对象.