软件模式之Flyweight模式.pdf
《软件模式之Flyweight模式.pdf》由会员分享,可在线阅读,更多相关《软件模式之Flyweight模式.pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、FlyweightFlyweight 模式模式一意图一意图运用共享技术有效地支持大量细粒度的对象。二二适用性适用性1、一个应用程序使用了大量的对象。2、完全由于使用大量的对象,造成特别大的存储开销。3、对象的大多数状态都可变为外部状态。4、要是删除对象的外部状态,那么能够用相对较少的共享对象取代许多组对象。5、应用程序不依靠于对象标识。由于 Flyweight对象能够被共享,关于概念上明显有不的对象,标识测试将返回真值。三实例:三实例:设计一个图书的治理系统,每本书都有出版社、编号、作者、价钞票等的属性,因此那个书的类能够如此设计:classBookclassBook public:publi
2、c:stringGetPublish()returnm_publishCompany;stringGetPublish()returnm_publishCompany;stringGetWriter()returnm_writer;stringGetWriter()returnm_writer;intGetBookID()returnm_bookID;intGetBookID()returnm_bookID;intGetPrice()returnm_price;intGetPrice()returnm_price;stringGetName()returnm_name;stringGetNam
3、e()returnm_name;voidSetPublish(string&s)m_publishCompany=s;voidSetPublish(string&s)m_publishCompany=s;voidSetWriter(string&s)m_writer=s;voidSetWriter(string&s)m_writer=s;voidSetBookID(intid)m_bookID=id;voidSetBookID(intid)m_bookID=id;voidSetPrice(intprice)m_price=price;voidSetPrice(intprice)m_price=
4、price;voidSetName(string&s)m_name=s;voidSetName(string&s)m_name=s;private:private:stringm_publishCompany;/stringm_publishCompany;/出版社出版社stringm_writer;/stringm_writer;/作者作者intm_bookID;/intm_bookID;/书籍编号书籍编号intm_price;/intm_price;/价钞票价钞票stringm_name;/stringm_name;/书名书名;这特不自然。然而随着系统的开发和试运行,这种设计就表现出一些缺
5、乏的地点了,例如一般图书会特不多,成千上万本,在这些书中可能会有相同的出版社或者相同的作者,那对每本书来讲就会重复了,也确实是根基白费了一些重复的空间。要是每本书都消耗一些空间,那整个软件系统所消耗的空间是不可想象的。因此,我们就要想方法来解决那个咨询题。想象一下系统里面 Book 类的使用:1、先瞧瞧不用共享模式:Bookbook1,book2,book3;Bookbook1,book2,book3;book1.SetPublish(book1.SetPublish(机械工业出版社机械工业出版社););book1.SetWriter(book1.SetWriter(候捷候捷););book1
6、.SetBookID(0000);book1.SetBookID(0000);book1.SetPrice(20);book1.SetPrice(20);book1.SetName(C+book1.SetName(C+好野好野););book2.SetPublish(book2.SetPublish(人民邮电出版社人民邮电出版社););book2.SetWriter(book2.SetWriter(候捷候捷););book2.SetBookID(0001);book2.SetBookID(0001);tPrice(30);tPrice(30);book2.SetName(C+book2.Set
7、Name(C+是好劲是好劲););book3.SetPublish(book3.SetPublish(机械工业出版社机械工业出版社););book3.SetWriter(book3.SetWriter(一雨田一雨田););book3.SetBookID(0002);book3.SetBookID(0002);book3.SetPrice(50);book3.SetPrice(50);book3.SetName(C+book3.SetName(C+无得顶,我是铁头功无得顶,我是铁头功.);.);那个地点有两个“机械工业出版社和两个“候捷,重复了。要是使用共享模式的话,那个地点的白费就能够防止了。
8、不瞧那个地点只有两个,想象一下成千上万本书时的空间白费.2、使用共享模式,把出版社和作者两个属性作为享元(FlyWeight)PublishFlyweightFactorypff;PublishFlyweightFactorypff;WriterFlyweightFactorywff;WriterFlyweightFactorywff;Bookbook1,book2,book3;Bookbook1,book2,book3;book1.SetPublish(pff.GetPublish(book1.SetPublish(pff.GetPublish(机械工业出版社机械工业出版社)-GetName
9、();)-GetName();ter(wff.GetWriter(ter(wff.GetWriter(候捷候捷)-GetName();)-GetName();book1.SetBookID(0000);book1.SetBookID(0000);book1.SetPrice(20);book1.SetPrice(20);book1.SetName(C+book1.SetName(C+好野好野););book2.SetPublish(pff.GetPublish(book2.SetPublish(pff.GetPublish(人民邮电出版社人民邮电出版社)-GetName();)-GetName
10、();book2.SetWriter(wff.GetWriter(book2.SetWriter(wff.GetWriter(候捷候捷)-GetName();)-GetName();book2.SetBookID(0001);book2.SetBookID(0001);book2.SetPrice(30);book2.SetPrice(30);book2.SetName(C+book2.SetName(C+是好劲是好劲););blish(blish(机械工业出版社机械工业出版社)-GetName();)-GetName();book3.SetWriter(wff.GetWriter(book3
11、.SetWriter(wff.GetWriter(一雨田一雨田)-GetName();)-GetName();book3.SetBookID(0002);book3.SetBookID(0002);book3.SetPrice(50);book3.SetPrice(50);book3.SetName(C+book3.SetName(C+无得顶,我是铁头功无得顶,我是铁头功.);.);什么缘故使用了 PublishFlyweightFactory 和 WriterFlyweightFactory 之后就能够节约空间了呢?微妙就在于 GetPublish 和 GetWriter 的实现:Publi
12、shFlyweight*GetPublish(stringkey)PublishFlyweight*GetPublish(stringkey)PublishFlyweight*p;PublishFlyweight*p;mapPublish:iteratorit;mapPublish:iteratorit;it=mapPublish.find(key);it=mapPublish.find(key);/存在那个存在那个 WriterWriterif(it!=mapPublish.end()if(it!=mapPublish.end()p=it;p=it;elseelse/插进那个插进那个 Pub
13、lishFlyweightPublishFlyweightp=newPublishFlyweight(key);p=newPublishFlyweight(key);mapPublishkey=p;mapPublishkey=p;returnp;returnp;GetWriter 的实现大同小异,那个地点就不列出来了,请瞧具体代码里的实现。下面是完整的代码,能够在一个 CPP 文件里编译使用:#pragma#pragmawarning(disable:4786)warning(disable:4786)#include#include#include#include#include#inclu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 模式 Flyweight
限制150内