欢迎来到天天文库
浏览记录
ID:47365888
大小:91.50 KB
页数:11页
时间:2019-07-30
《重温设计模式(一)——享元模式(Flyweight)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、重温设计模式(一)——享元模式(Flyweight)作者:飞林沙 出处:博客园 2009-4-19:40:16 阅读 0 次一.世间万物皆为对象从大学校园中拦住一个软件工程专业的学生,问他,什么是面向对象。他会告诉你,世间万物皆是对象。世界之大,何止万物。上至宇宙星辰,下至细菌病毒。皆为对象。女孩,吐气如兰,仍留淡淡余香。男孩,闭眼陶醉,不亦乐乎。此乃共享之妙也!二.对象爆炸呼吸之间,分子无数。每个分子皆为一对象,恐万台服务器之矩阵亦无可容。奈何乎?GOF曰:享元模式!三.何为享元模式Flyweight:次最轻量级的拳击选手。即
2、粒度最小。因此,享元模式的目的是采用共享技术解决大量细粒度对象的爆炸问题。图:四.享元模式应用之QQ聊天我们不妨假设QQ是在服务器端将每次的对话都抽象出来形成了一个类。于是代码如下:classPeople{privatestringname;privateintage;publicstringName{get{returnname;}}publicintAge{get{returnage;}set{age=value;}}publicPeople(stringname,intage){this.name=name;this.ag
3、e=age;}} classChat{privatePeopleboy;privatePeoplegirl;privatestringchatContent;publicChat(Peoplep1,Peoplep2){this.boy=p1;this.girl=p2;}publicstringChatContent{get{returnchatContent;}set{chatContent=value;}}publicPeopleBoy{get{returnboy;}}publicPeopleGirl{get{returngi
4、rl;}}}若每次二者聊天时均将Chat实例化为一个对象,如下:classProgram{staticvoidMain(string[]args){Peopleboy=newPeople("PrettyBoy",20);Peoplegirl=newPeople("BeautifulGirl",18);Chatchat=newChat(boy,girl);chat.ChatContent="Iloveyou";ChatServer.Send(chat);}}若如此,服务器就需要每次都去初始化一个对象,而当chatServer将此次
5、聊天的记录发送给客户机之后,这个对象便成了垃圾对象。这样,每小时几百万的聊天次数,便有了几百万的对象垃圾。垃圾回收器GC便需要不停地去工作,回收对象。这就对效率产生了极大的影响。于是,我们想办法,使用享元模式来解决这个问题。两者聊天,他们的聊天方是不变的,因此,我们可以在服务器端去维护一个这样的Chat对象集合,如果该聊天对象已经存在,那么我们便重复去利用这个聊天对象。这样既减少了内存垃圾,又节省了创建对象的时间。代码如下:classFlyweightFactory{privateIDictionary
6、cache=newDictionary();privatevoidAdd(Chatc){cache.Add(c.Boy.Name+"_"+c.Girl.Name,c);}publicChatGetChat(Peopleboy,Peoplegirl){if(!cache.ContainsKey(boy.Name+"_"+girl.Name)){cache.Add(boy.Name+"_"+girl.Name,newChat(boy,girl));}returncache[boy.Name+"_"+girl
7、.Name];}}于是,从客户端访问该FlyweightFactory即可。这样,便有效控制了对象的数量。五.享元模式的.NETFramework典型应用——String(在这里麻烦请教一下各位,我想在Reflector中,看一下String赋值的具体代码,怎么找到呢?比如说strings=”111”;这一步的代码)好,步入正题,让我们来看看享元模式在.NETFramework中的应用。String无论在.NET还是Java中,都是一个特殊的引用对象。我们可以试想,出现了这样一段代码:Strings=”Helloworld”;S
8、trings1=”Helloworld”;那么是不是每次都要重新的去申请一块内存,然后去保存这个字符串呢?那么这样的话是不是会效率很低呢?因为我们知道,字符串在实际使用中往往都是非常短暂的。他们通常是被读出来之后,便直接展示给了客户。然后这个字符串的生命结束,变
此文档下载收益归作者所有