c++设计模式之享元模式
2016-07-26 20:44
302 查看
享元模式
定义:享元模式(FlyWeight),运用共享技术有效的支持大量细粒度的对象。
享元模式结构图:
兑现代码:
总结:
可以共享的对象,也就是说返回的同一类型的对象其实是同一实例,当客户端要求生成一个对象时,工厂会检测是否存在此对象的实例,如果存在那么直接返回此对象实例,如果不存在就创建一个实例并保存起来。通常工厂类会有一个集合类型的成员变量来用以保存对象,如map,hashtable,vector等。
定义:享元模式(FlyWeight),运用共享技术有效的支持大量细粒度的对象。
享元模式结构图:
兑现代码:
#include <iostream> #include <string> #include "map" using namespace std; class Person { public: Person(string name,int age) { this->m_name=name; this->m_age; } virtual void print()=0; protected: string m_name; int m_age; }; class Teacher:public Person { public: Teacher(string name, int age,string id):Person(name,age) { this->m_id; } void print() { cout<<"name:"<<m_name<<"age:"<<m_age<<"id:"<<m_id<<endl; } 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)); return 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"); p2=fwtf->GetTeacher("001"); p1->print(); p2->print(); delete fwtf; cout<<"nihao..."<<endl; system("pause"); return ; }
总结:
可以共享的对象,也就是说返回的同一类型的对象其实是同一实例,当客户端要求生成一个对象时,工厂会检测是否存在此对象的实例,如果存在那么直接返回此对象实例,如果不存在就创建一个实例并保存起来。通常工厂类会有一个集合类型的成员变量来用以保存对象,如map,hashtable,vector等。