Rust语言之GoF设计模式:Flyweight享元模式

22-09-26 banq

Flyweight(缓存/享元)是一种结构设计模式,它允许程序通过保持低消耗来支持大量的对象。
它可以是一个隐藏在类似 Facade 的 API 后面的内部缓存。缓存存储从多个对象引用的共享部分。

Flyweight是让weight重量的东西飞起来,实现轻量化,当你有需要更轻量级的对象时发挥作用,通常是因为你有太多的对象。

游戏中广袤的树林场景是如何实现的?
雾气散去,露出一片雄伟的古老森林。古老的铁杉,数不胜数,耸立在你面前,形成一个绿色的大教堂。树叶的彩色玻璃罩将阳光分割成金色的雾状。在巨大的树干之间,你可以看到巨大的森林正在向远处退去。

当你在屏幕上填满了一整片单独的树木时,图形程序员所看到的只是数百万个多边形,他们必须以某种方式每六十分之一秒将其渲染到 GPU 上。
每棵树都有包含数千个多边形的详细几何图形。即使您有足够的内存来描述该森林,为了渲染它,该数据也必须通过总线从 CPU 传输到 GPU。
使用Direct3D 和 OpenGL 的实例渲染,它们占用的内存不是太多,而是它们需要太多时间将每个单独的树通过总线推送到 GPU。

轻量化享元模式是通过将对象的数据分成两种来解决这个问题。
  • 第一种数据是不特定于该对象的单个实例并且可以在所有实例之间共享的东西。GoF四人组称这是内在状态,但也可视为“无上下文”的东西。如树的几何形状和纹理。
  • 其余数据是外部状态,即某个实例独有的东西,无法在多个实例之间共享的。如每棵树的位置、比例和颜色。

这种模式通过在对象出现的每个地方共享一个内在状态复制副本来节省内存。

如果一个事物或对象没有明确定义的标识的情况下可以成为共享对象,在这些情况下,感觉更像是一个物体神奇地同时出现在多个地方。
DDD值对象 概念也是这种享元模式的实现。

这个模式类似于类型对象Type Object
享元和类型对象之间的界限有点​​棘手。使用类型对象来使事情更容易维护,并且避免必须为东西创建实际的类。共享内存是一个不错的奖励。使用flyweights唯一的目的是资源共享。