博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式攻略】结构型模式之Flyweight 模式
阅读量:3523 次
发布时间:2019-05-20

本文共 1214 字,大约阅读时间需要 4 分钟。

概要
系统中有时我们会创建大量对象,而这些对象间又存在部分相同的特性,完全独立去创建这些对象会消耗大量内存,对象间也存在重复冗余的部分。所以,可以考虑把对象间那部分相同的内容通过共享元来进行共享,节省内存,避免冗余。
目的
提取大量对象中相同的特性,通过共享对象来封装,节省对象存储空间,提高效率。
应用
老规矩,从实例中看真相吧。比如说我们有个地图的应用,地图上有各种标识用来显示具体位置,比如有酒店标识,银行标识,超市标识这三种标识,就以酒店标识为例:
class HotelMark {public:     HotelMark() {          mImage = new HotelImage();     }     void ShowMark();private:     int mPos_x;     int mPos_y;     HotelImage* mImage;};
地图上需要标识的酒店有很多,如果为每个标识都创建一个对象,需要创建大量的内存,我们可以注意到,每个HotelMark的显示标签式样都是相同的,不同的只是对应的坐标,所以对所有HotelMark来说,只需要一份HotelImage,可以共享一份。
Class HotelImageFactory {public:     static HotelImage* GetInstance() {          if (mImage == NULL) {               mImage = new HotelImage();          }          return mImage;     }private:     static HotelImage* mImage;};class HotelMark {public:     HotelMark() {          mImage = HotelImageFactory::GetInstance();     }     void ShowMark();private:     int mPos_x;     int mPos_y;     HotelImage* mImage;};
HotelMark在获得HotelImage对象时,通过一个工厂类,统一取得共享的HotelImage对象。这样我们把不变的可以共享的部分放在了共享元中,而在标识对象里只保留会发生变化的特性。
应用
从上面的说明来看,Flyweight这种模式很简单,我在这里举了一个傻瓜般的例子只是为了说明问题,关于对象怎么释放等问题不在这个讨论范围。但是在实际应用中却并非如此,其实为了能够抽出可以共享的部分并非那么容易,有时需要修饰以后才能共享,有时甚至还要通过特定的算法来实现共享。目前,在一些文本格式编辑器以及一些游戏里,Flyweight模式相对用的比较多。
         

转载地址:http://yceqj.baihongyu.com/

你可能感兴趣的文章
集合,Collection
查看>>
泛型详解
查看>>
泛型实现斗地主
查看>>
List集合
查看>>
ArrayList集合,LinkedList集合,Vector集合
查看>>
HashSet集合
查看>>
并发与并行,线程与进程
查看>>
方法引用,通过对象名引用成员变量
查看>>
常用工具类 Math:数学计算 Random:生成伪随机数 SecureRandom:生成安全的随机数 2020-2-13
查看>>
Java的异常Exception 2020-2-13
查看>>
Java标准库定义的常用异常,自定义异常 2020-2-15
查看>>
Java问题百度/Google记录 2020-2-16
查看>>
【PADS9.5】9,对比ECO核心板,Router移动元件后布线消失,Router找不到自动布线策略文件丢失或损坏
查看>>
【STM32+w5500汇总】23,HTTP_Client 连接到ONENET上传了一段数据之后会断开,数据上传格式的设置
查看>>
【STM32+W5500+MQTT】24,所有功能都可以通过API函数的调用来实现;HTTP接入ONENET,API开发手册和打包函数,串口软件HTTP连接服务器上传数据,2018年12月28日
查看>>
【STM32+W5500+HTTPClient】25,路由器DHCP租赁IP时间为2h,NetBios可以很好的解决IP变化的问题,DNS,2018年12月25日
查看>>
【STM32+MQTT+ONENET】26,MQTT协议接入OneNET
查看>>
【STM32+W5500+MQTT+ONENET】27,MQTT协议接入OneNET实际编程操作 2018年12月27日
查看>>
【STM32Cube+FreeRTOS 】28,KEIL5的F12不起作用;***JLink Error: Can not read register x while CPU is running
查看>>
【STM32CubeMX+FreeRTOS 】29,prtinf卡死;4任务只运行了3个;W5500联网失败(堆栈不能太大或者太小)
查看>>