享元模式
概念
Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。说白了,就是共享内存,共享对象!
角色和职责
抽象享元角色:
所有具体享元类的父类,规定一些需要实现的公共接口。具体享元角色:
抽象享元角色的具体实现类,并实现了抽象享元角色规定的方法。享元工厂角色:
负责创建和管理享元角色。
使用场景:
是以共享的方式,高效的支持大量的细粒度的对象。
案例
#include <iostream>
#include <map>
using namespace std;
/*享元--共享元素
用共享的方式,高效的支持大量细粒度的的对象
*/
class Person
{
public:
Person(string name,int age)
{
m_name = name;
m_age = age;
}
virtual void printTeacher() = 0;
protected:
string m_name;
int m_age;
};
class Teacher : public Person
{
public:
Teacher(string name,int age,string id):Person(name,age)
{
m_id = id;
}
virtual void printTeacher()
{
cout<<"name : "<<m_name<<"\tage :"<<m_age<<"\tid: "<<m_id<<endl;
}
private:
string m_id;
};
/*完成老师节点的存储*/
class FlyWeightFactory
{
public:
FlyWeightFactory()
{
map1.clear();
}
~FlyWeightFactory()
{
while(!map1.empty())
{
Person*tmp =NULL;
map<string,Person *>::iterator it = map1.begin();
tmp = it->second;
map1.erase(it);
delete tmp;
}
}
Person * GetTeacher(string id)
{
map<string,Person *>::iterator it ;
it = map1.find(id);
if(it == map1.end())
{
string name;
int age;
cout <<"input name:"<<endl;
cin >>name;
cout <<"input age:"<<endl;
cin >>age;
Person* tmp = new Teacher(name,age,id);
map1.insert(pair<string,Person*>(id,tmp));
return tmp;
}else{
return it->second;
}
}
private:
map<string,Person *> map1;
};
int main2610()
{
FlyWeightFactory * fwt = new FlyWeightFactory;
Person *p1 = NULL;
p1 = fwt->GetTeacher("001");
p1->printTeacher();
Person *p2 = NULL;
p2 = fwt->GetTeacher("001");
p2->printTeacher();
delete fwt;
return 0;
}