zoukankan      html  css  js  c++  java
  • 【设计模式系列】结构型模式之Flyweight 模式

    概要
    系统中有时我们会创建大量对象,而这些对象间又存在部分相同的特性,完全独立去创建这些对象会消耗大量内存,对象间也存在重复冗余的部分。所以,可以考虑把对象间那部分相同的内容通过共享元来进行共享,节省内存,避免冗余。

    目的
    提取大量对象中相同的特性,通过共享对象来封装,节省对象存储空间,提高效率。

    应用
    老规矩,从实例中看真相吧。比如说我们有个地图的应用,地图上有各种标识用来显示具体位置,比如有酒店标识,银行标识,超市标识这三种标识,就以酒店标识为例:
    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模式相对用的比较多。
             

  • 相关阅读:
    Bootstrap组件---nav(导航条)
    (2)基于Bootstrap的网页开发
    Bootstrap组件简要汇总解析(不定期更新)
    知识碎片(长期更新)
    DOM中document对象的常用属性方法总结
    IE678如何兼容css3圆角属性
    17年面试问题总结
    0.1 js复习
    Basic knowledge about energy field
    BDA: single parameter models
  • 原文地址:https://www.cnblogs.com/secbook/p/2655120.html
Copyright © 2011-2022 走看看