设计模式 ---- 享元模式

享元模式(错误,待修改)

关于享元模式,最重要的一点:共享

享元模式主要用于解决大量对象存在时,重复数据造成的内存占用问题。

在游戏开发中,经常会出现这样的情况:

例如一个场景中生成了大量相同类型的树、NPC、小怪。

一棵树可能包含:

class Tree
{
public:

    Mesh* mesh;
    Texture* texture;
    Material* material;

    FVector position;
    float rotation;
    float scale;
};

其中:

Mesh
Texture
Material

对于同一种树来说,通常都是相同的。

真正不同的可能只有:

Position
Rotation
Scale

例如:

Tree tree1;
tree1.mesh = TreeMesh;
tree1.texture = TreeTexture;
tree1.material = TreeMaterial;
tree1.position = FVector(100, 200, 0);

Tree tree2;
tree2.mesh = TreeMesh;
tree2.texture = TreeTexture;
tree2.material = TreeMaterial;
tree2.position = FVector(500, 300, 0);

虽然 tree1tree2 是两个不同的对象,但它们使用的是完全相同的:

Mesh
Texture
Material

如果这些数据被作为对象自身的一部分保存,那么随着对象数量增加,就可能产生大量重复数据。

所以,我们可以把可以共享的状态提取出来

class TreeType
{
public:

    Mesh* mesh;
    Texture* texture;
    Material* material;
};

TreeType 就可以理解为一种“树的类型”。

然后具体的树对象只保存自己独有的状态:

class Tree
{
public:

    TreeType* type;

    FVector position;
    float rotation;
    float scale;
};

于是:

TreeType normalTree;

Tree tree1;
tree1.type = &normalTree;
tree1.position = FVector(100, 200, 0);

Tree tree2;
tree2.type = &normalTree;
tree2.position = FVector(500, 300, 0);

Tree tree3;
tree3.type = &normalTree;
tree3.position = FVector(800, 100, 0);

此时:

Tree1 ─────┐
Tree2 ─────┼──→ normalTree
Tree3 ─────┘

三棵树共享同一个 TreeType

其中:

TreeType
    ↓
Mesh
Texture
Material

属于可以共享的内部状态

而:

Tree
    ↓
Position
Rotation
Scale

属于每个对象自己独有的外部状态

因此,享元模式的核心可以总结为:

将大量对象中重复的状态提取出来,形成可以共享的享元对象,让多个对象共同使用它,从而减少重复数据带来的内存开销。

需要注意的是,使用指针本身并不等于使用了享元模式

指针只是实现共享的一种手段。

真正体现享元模式的是:

发现对象之间存在大量重复状态 → 把重复状态抽取成独立对象 → 多个对象共享这个对象。

posted on 2026-09-06 20:11  咸云闲鱼  阅读(7)  评论(0)    收藏  举报