享元模式(flyweight)是一种进行性能优化的模式,通过共享技术来支持大量细粒度的对象
如果系统中创建了大量相似的对象,我们就可以通过享元模式节省内存
反例
服装厂生产了一堆衣服,需要模特拍照片,假设有 100 个衣服被生产,就 new 了 100 个模特出来给衣服拍照片,显然内存要爆炸
这时我们把模特抽象出来,通过 更新他身上的衣服,执行拍照方法,就避免了过多的内存消耗,这个步骤将对象的属性划分成了内部状态和外部状态,每个对象都有拍照这个内部属性,穿的衣服、性别都是外部属性,减少了共享对象的数量~
- 内部状态 存储在对象内部
- 内部状态 可以被一些对象共享
- 内部状态 独立于场景,一般不会改变
- 外部状态 取决于场景,根据场景变化
虽然修改外部状态也需要花费一定时间,但总比新建一个对象要好,所以这是一种时间换空间的优化方式,上面的例子中,衣服就是外部属性,拍照就是内部属性~
应用
上面的修改是基于享元模式的一个小改动,完整的享元模式还应该包含一个享元模式对象工厂,下面是 Unity 中一个常见的情景
正常来说我们用 new 创建 100 个粒子,性能可能不受影响,但 10000 个有可能就得爆炸了!
看下面的代码理解享元模式的好处在哪:
using System;
using System.Collections.Generic;
// 享元接口
interface IParticle
{
void Move(int x, int y);
void Draw();
}
// 具体享元类
class Particle : IParticle
{
private string color;
public Particle(string color)
{
this.color = color;