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

相关推荐
jctech6 小时前
让「小程序」跑起真正的原生代码:ComboNative 多进程原生小程序运行时 · Alpha 首发
android·设计模式·架构
Kel1 天前
Node.js 单线程高并发:从内核中断到 JS 回调的完整技术栈
设计模式·架构·node.js
解局易否结局2 天前
ArkUI MVI 架构实战:单向数据流设计模式在 HarmonyOS NEXT 中的深度实践
华为·设计模式·架构·harmonyos
解局易否结局2 天前
ArkTS 设计模式与架构进阶:构建可维护的 HarmonyOS 应用
华为·设计模式·架构·harmonyos
happyness442 天前
AI编程与设计模式
设计模式·ai编程
就是小王同学啊2 天前
Spring小技巧之设计模式
sql·spring·设计模式
Larcher3 天前
当 AI 学会写代码:一个自动生成 React 项目的 Agent 实战
人工智能·设计模式·程序员
zjun10013 天前
C++常用的设计模式
c++·设计模式
我登哥MVP3 天前
走进 Gang of Four 设计模式:解释器模式
java·设计模式·解释器模式
我登哥MVP3 天前
走进 Gang of Four 设计模式:过滤器模式
java·设计模式·过滤器模式