#include "map"
class Person
{
public:
Person(string name, int age)
{
this->m_name = name;
this->age = age;
}
virtual void printT() = 0;
protected:
string m_name;
int age;
};
class Teacher : public Person
{
public:
Teacher(string name, int age, string id) : Person(name, age)
{
this->m_id = id;
}
void printT()
{
cout << "name:" << m_name << " age:" << age << " m_id:" << m_id << endl;
}
protected:
private:
string m_id;
};
//完成 老师结点 存储
class FlyWeightTeacherFactory
{
public:
FlyWeightTeacherFactory()
{
map1.clear();
}
~FlyWeightTeacherFactory()
{
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)
{
Person *tmp = NULL;
map<string, Person *>::iterator it ;
it = map1.find(id);
if (it == map1.end()) //没有找到
{
string tmpname;
int tmpage;
cout << "\n请输入老师name:";
cin >> tmpname;
cout << "\n请输入老师age:";
cin >> tmpage;
tmp = new Teacher(tmpname, tmpage, id);
map1.insert(pair<string, Person*>(id, tmp) );
}
else
{
tmp = it->second;
}
return tmp;
}
private:
map<string, Person *> map1;
};
void main()
{
Person *p1 = NULL;
Person *p2 = NULL;
FlyWeightTeacherFactory *fwtf = new FlyWeightTeacherFactory;
p1 = fwtf->GetTeacher("001");
p1->printT();
p2 = fwtf->GetTeacher("001");
p2->printT();
delete fwtf;
cout<<"hello..."<<endl;
system("pause");
return ;
}
享元模式总结
享元模式的主要优点如下:
1.可以极大减少内存中对象的数量,使得相同或相似对象在内存中只保存一份,从而可以节约系统资源,提高系统性能。
2.享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享。
享元模式的主要缺点如下:
1.享元模式使得系统变得复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化。
2.为了使对象可以共享,享元模式需要将享元对象的部分状态外部化,而读取外部状态将使得运行时间变长。
适用场景:
1.一个系统有大量相同或者相似的对象,造成内存的大量耗费。
2.对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应当在需要多次重复使用享元对象时才值得使用享元模式。