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

相关推荐
怕浪猫19 小时前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane199421 小时前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19942 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..2 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1502 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)3 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
sarasuki4 天前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
小王师傅664 天前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
执明wa4 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio
sarasuki4 天前
如何让 Agent 获取更多的能力?插件 / 技能系统
人工智能·设计模式·agent