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

相关推荐
ximu_polaris1 天前
设计模式(C++)-行为型模式-模版方法模式
c++·设计模式
A-Jie-Y1 天前
JAVA设计模式-抽象工厂模式
java·设计模式
故事还在继续吗1 天前
设计模式完全指南
设计模式
薛定谔的悦1 天前
共享数据总线(DPR)设计模式——嵌入式系统的“内存数据库”
jvm·数据库·设计模式
A-Jie-Y1 天前
JAVA设计模式-建造者模式
java·设计模式
无敌秋1 天前
# C++ 工厂方法模式实战指南
开发语言·c++·设计模式
a里啊里啊1 天前
软考-软件评测师:知识点整理(七)——软件工程
设计模式·软件工程·软考·uml·结构化开发·软件评测师·软件模型
ximu_polaris1 天前
设计模式(C++)-行为型模式-策略模式
c++·设计模式·策略模式
geovindu1 天前
go: Observer Pattern
开发语言·观察者模式·设计模式·golang
z小天才b2 天前
Java 设计模式完全指南:从入门到精通
java·开发语言·设计模式