电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

软件模式之Flyweight模式VIP免费

软件模式之Flyweight模式_第1页
1/14
软件模式之Flyweight模式_第2页
2/14
软件模式之Flyweight模式_第3页
3/14
Flyweight模式一.意图运用共享技术有效地支持大量细粒度的对象。二.适用性1、一个应用程序使用了大量的对象。2、完全由于使用大量的对象,造成很大的存储开销。3、对象的大多数状态都可变为外部状态。4、如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。5、应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。三.实例:设计一个图书的管理系统,每本书都有出版社、编号、作者、价钱等的属性,所以这个书的类可以这样设计:classBook{public:stringGetPublish(){returnm_publishCompany;}stringGetWriter(){returnm_writer;}intGetBookID(){returnm_bookID;}intGetPrice(){returnm_price;}stringGetName(){returnm_name;}voidSetPublish(string&s){m_publishCompany=s;}voidSetWriter(string&s){m_writer=s;}voidSetBookID(intid){m_bookID=id;}voidSetPrice(intprice){m_price=price;}voidSetName(string&s){m_name=s;}private:stringm_publishCompany;//出版社stringm_writer;//作者intm_bookID;//书籍编号intm_price;//价钱stringm_name;//书名};这非常自然。但是随着系统的开发和试运行,这种设计就表现出一些不足的地方了,例如一般图书会非常多,成千上万本,在这些书中可能会有相同的出版社或者相同的作者,那对每本书来说就会重复了,也就是浪费了一些重复的空间。如果每本书都耗费一些空间,那整个软件系统所耗费的空间是不可想象的。所以,我们就要想办法来解决这个问题。想象一下系统里面Book类的使用:1、先看看不用共享模式:Bookbook1,book2,book3;book1.SetPublish("机械工业出版社");book1.SetWriter("候捷");book1.SetBookID(0000);book1.SetPrice(20);book1.SetName("C++好野");book2.SetPublish("人民邮电出版社");book2.SetWriter("候捷");book2.SetBookID(0001);book2.SetPrice(30);book2.SetName("C++是好劲");book3.SetPublish("机械工业出版社");book3.SetWriter("一雨田");book3.SetBookID(0002);book3.SetPrice(50);book3.SetName("C++无得顶,我是铁头功...");这里有两个“机械工业出版社”和两个“候捷”,重复了。如果使用共享模式的话,这里的浪费就可以避免了。别看这里只有两个,想象一下成千上万本书时的空间浪费...2、使用共享模式,把出版社和作者两个属性作为享元(Fly~~Weight)PublishFlyweightFactorypff;WriterFlyweightFactorywff;Bookbook1,book2,book3;book1.SetPublish(pff.GetPublish("机械工业出版社")->GetName());book1.SetWriter(wff.GetWriter("候捷")->GetName());book1.SetBookID(0000);book1.SetPrice(20);book1.SetName("C++好野");book2.SetPublish(pff.GetPublish("人民邮电出版社")->GetName());book2.SetWriter(wff.GetWriter("候捷")->GetName());book2.SetBookID(0001);book2.SetPrice(30);book2.SetName("C++是好劲");book3.SetPublish(pff.GetPublish("机械工业出版社")->GetName());book3.SetWriter(wff.GetWriter("一雨田")->GetName());book3.SetBookID(0002);book3.SetPrice(50);book3.SetName("C++无得顶,我是铁头功...");为什么使用了PublishFlyweightFactory和WriterFlyweightFactory之后就可以节省空间了呢?奥妙就在于GetPublish和GetWriter的实现:PublishFlyweight*GetPublish(stringkey){PublishFlyweight*p;mapPublish::iteratorit;it=mapPublish.find(key);//存在这个Writerif(it!=mapPublish.end())p=it;else{//插入这个PublishFlyweightp=newPublishFlyweight(key);mapPublish[key]=p;}returnp;}GetWriter的实现大同小异,这里就不列出来了,请看详细代码里的实现。下面是完整的代码,可以在一个CPP文件里编译使用://Flyweight.cpp#pragmawarning(disable:4786)#include#include#includeusingnamespacestd;classBook{public:stringGetPublish(){return*m_publishCompany;}stringGetWriter(){return*m_writer;}intGetBookID(){returnm_bookID;}intGetPrice(){returnm_price;}stringGetName(){...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

软件模式之Flyweight模式

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部