Unity23种设计模式之 享元模式

使用场景:同一个UI图标被创建了上百次、子弹特效数字疯狂new

1.一句话理解享元模式

核心思想:相同的东西,只创建一份,多处共享。

解决:内存占用和创建成本问题

2.享元模式到底在分什么?

把对象拆成两部分:

(1)内部状态 可共享

不会变、可以复用,比如Mesh、material、Sprite

(2)外部状态 不可共享

每个实例都不一样,使用时传入,比如位置、旋转、血量、UI文本内容等

3.实战演示

(1)享元对象(共享部分)

cs 复制代码
public class BulletFlyweight
{
    public Mesh Mesh;
    public Material Material;

    public BulletFlyweight(Mesh mesh, Material material)
    {
        Mesh = mesh;
        Material = material;
    }
}

(2)享元工厂(关键)

cs 复制代码
public class BulletFlyweightFactory
{
    private Dictionary<string, BulletFlyweight> _cache 
        = new Dictionary<string, BulletFlyweight>();

    public BulletFlyweight Get(string type)
    {
        if (!_cache.TryGetValue(type, out var flyweight))
        {
            flyweight = Create(type);
            _cache[type] = flyweight;
        }
        return flyweight;
    }

    private BulletFlyweight Create(string type)
    {
        return new BulletFlyweight(
            LoadMesh(type),
            LoadMaterial(type)
        );
    }
}

(3)使用时传入外部状态

cs 复制代码
public void Fire(Vector3 pos, Vector3 dir)
{
    var flyweight = factory.Get("NormalBullet");

    Graphics.DrawMesh(
        flyweight.Mesh,
        pos,
        Quaternion.LookRotation(dir),
        flyweight.Material,
        0
    );
}

4.享元模式VS对象池

对比 享元模式 对象池
关注点 共享数据 复用实例
是否 new 很少 先 new 一批
核心 内存节省 GC / 性能

5.享元模式常见的坑

cs 复制代码
flyweight.Material.color = Color.red;

所有使用这个材质的对象都会变红

解决方案:共享对象设置只读,或者clone一份

相关推荐
阿闽ooo2 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4962 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃2 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20102 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈2 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||3 天前
安装依赖三方exe/msi的软件设计模式
设计模式
希望_睿智3 天前
实战设计模式之访问者模式
c++·设计模式·架构
茶本无香3 天前
设计模式之十六:状态模式(State Pattern)详解 -优雅地管理对象状态,告别繁琐的条件判断
java·设计模式·状态模式
驴儿响叮当20103 天前
设计模式之备忘录模式
设计模式·备忘录模式
驴儿响叮当20103 天前
设计模式之迭代器模式
设计模式·迭代器模式