Flyweight(享元模式)

定义

GOF:运用共享技术有效地支持大量细粒度的对象。
GOF的定义比较专业化,通俗来说,当你有大量相似的实例时,你把其中相同的实例取出来共享。

例子

在你的游戏场景中,你需要用到多种地形,比如草地(Grass)、山脉(Hill)、河流(River)等,如下所示:

地形的类设计如下:

public class Terrain {
    private Texture tex;
    private int moveCost; //玩家移动速度损耗

    public Terrain(Texture t, int mc) {
      tex = t;
      mc = moveCost;
    }
}

很明显,同样类型地形的上述两个数据都是一样,如果像下面这样:

map[0,3] = new Terrain(GrassTex, 1);
map[1,0] = new Terrain(GrassTex, 1);

每个方格都创建一个新的实例,很明显是十分浪费内存的。更好的做法应该是:

Terrain grass = new Terrain(GrassTex, 1);
map[0,3] = grass;
map[1,0] = grass;

这样,我们就把一些相同的实例抽取了出来进行共享,降低了内存消耗。为了更好地管理这些地形实例,我们可以用一个单例的工厂类来进行管理:

public class TerrainFactory {
  private TerrainFactory _Instance;
  private TerrainFactory() {}

  public Instance() {
    //一些单例代码
  }

  private Hash<string, Terrain*> TerrainHash;

  public Terrain* GetTerrain(string type) {
    if(!TerrainHash.ContainKey(type))
      return null;
    return TerrainHash[type];
  }

  public void Add(string type, Terrain* terrain) {
    if(!TerrainHash.ContainKey(type))
      TerrainHash.Add(type, terrain);
  }
}

这样我们就能这样使用了:

TerrainFactory factory = TerrainFactory.Instance();
factory.Add("Grass", new Terrain(GrassTex, 1));
factory.Add("River", new Terrain(RiverTex, 10));
factory.Add("Hill", new Terrain(HillTex, 5));

map[0,0] = factory.GetTerrain("Hill");
map[0,1] = factory.GetTerrain("River");
...

进一步

上面提到的例子是一个简化的版本,四人帮提出的版本要复杂一点,但是思想都是一样的。我们可以根据需要进行相应的修改。


参考

  1. Game Programming Patterns
  2. 大话设计模式

享元模式 - Flyweight的更多相关文章

  1. 二十四种设计模式:享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...

  2. 设计模式(十)享元模式Flyweight(结构型)

    设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...

  3. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  4. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...

  5. 享元模式-Flyweight(Java实现)

    享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...

  6. Java享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern)主要用于减少创建的对象数量,并减少内存占用并提高性能. 这种类型的设计模式属于结构模式,因为该模式提供了减少对象计数的方法,从而改善应用的对象结构. 享元 ...

  7. 设计模式-11享元模式(Flyweight Pattern)

    1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...

  8. 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  9. 享元模式/Flyweight模式/对象结构型/设计模式

    flyweight 享元模式(对象结构型) Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意 ...

随机推荐

  1. llinux常用命令

    (1)Ctrl+alt+(1-6)可调用控制台程序 (2)date---可看时间日期 (3)date 月日时分年 ------可修改时间 (4)useradd-------新建用户 (5)passwd ...

  2. php gzcompress() 和gzuncompress()函数实现字符串压缩

    当我们说到压缩,我们可能会想到文件压缩,其实,字符串也是可以压缩的. PHP提供了 gzcompress() 和gzuncompress() 函数: $string = “Lorem ipsum do ...

  3. oracle is not in the sudoers file. This incident will be reported.

    准备把OS的root禁用了,所以其他用户要执行使用root执行的操作时,需要使用sudo. 在没有配置sudo的时候,执行sudo会出现类似以下的报错: [oracle@test ~]$ sudo / ...

  4. C++结构体内存对齐跨平台测试

    测试1,不规则对齐数据. Code: #include <stdio.h> #pragma pack(push) #pragma pack(8) struct Test8 { char a ...

  5. MR操作

    MR操作————Map.Partitioner.Shuffle.Combiners.Reduce 1.Map步骤 1.1 读取输入文件,解析成k-v对,其中每个k-v对调用一次map函数 1.2 写自 ...

  6. Web前端工程师成长之路——知识汇总

    一.何为Web前端工程师?          前端工程师,也叫Web前端开发工程师.他是随着web发展,细分出来的行业.Web前端开发工程师,主要职责是利用(X)HTML/CSS/JavaScript ...

  7. IIS 图片加载不出来

    如何为IIS增加svg和woff格式文件的支持 在我们新版的TopFlow中,使用了最新的bootstrap框架,此框架使用了字体文件来显示矢量的图标,为了能在IIS上正常显示图标,可以通过增加iis ...

  8. Tween Animation----Translate位置移动动画

    布局: 在res/下新建一个anim文件夹用来保存动画xml文件 新建一个translate文件 代码: <?xml version="1.0" encoding=" ...

  9. 2016多校联合训练4 F - Substring 后缀数组

    Description ?? is practicing his program skill, and now he is given a string, he has to calculate th ...

  10. bootstrap之HTML模板

    bootstrap之HTML模板 <!DOCTYPE html> <html> <head> <title>Bootstrap 模板</title ...