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一份

相关推荐
szm022511 小时前
设计模式-
设计模式
砍光二叉树11 小时前
【设计模式】创建型-抽象工厂模式
设计模式·抽象工厂模式
砍光二叉树12 小时前
【设计模式】创建型-工厂方法模式
设计模式·工厂方法模式
我爱学习_zwj13 小时前
设计模式-2(单例模式与原型模式)
前端·javascript·设计模式
砍光二叉树13 小时前
【设计模式】创建型-单例模式
单例模式·设计模式
我爱学习_zwj13 小时前
设计模式-3(装饰器模式)
前端·设计模式·装饰器模式
文心快码BaiduComate1 天前
Comate内置模型已支持 MiniMax-M2.7!
设计模式·程序员·前端框架
console.log('npc')1 天前
Cursor,Trae,Claude Code如何协作生产出一套前后台app?
前端·人工智能·react.js·设计模式·ai·langchain·ai编程
czxyvX1 天前
C++ - 基于多设计模式下的同步&异步日志系统
c++·设计模式
蒸蒸yyyyzwd2 天前
设计模式之美学习笔记
笔记·学习·设计模式