漫谈设计模式 [10]:享元模式

引导性开场

菜鸟:老鸟,我最近在做一个游戏开发项目,发现内存占用特别大,尤其是一些重复对象,非常浪费资源。你有什么建议吗?

老鸟:这个问题很常见。你听说过设计模式中的"享元模式"吗?它可以有效减少内存占用。

菜鸟:享元模式?没听过。能详细讲讲吗?

老鸟:当然可以。我们一步一步来,先看看你现在的实现方式,再逐步引出享元模式。

渐进式介绍概念

老鸟:假设你在游戏中有很多相同的树对象,每个树对象都保存了相同的属性,比如类型、颜色等。你会怎么实现呢?

菜鸟 :可能会创建一个 Tree 类,然后每次需要时实例化一个新的对象。

python 复制代码
class Tree:
    def __init__(self, type, color):
        self.type = type
        self.color = color

# 创建很多树对象
trees = [Tree("Oak", "Green") for _ in range(1000)]

老鸟:这就是问题所在。你创建了很多相同的树对象,占用了大量内存。其实这些对象的某些属性是可以共享的。

逐步展开的Python代码示例

菜鸟:共享属性?怎么做呢?

老鸟:我们可以通过享元模式来实现。首先,我们把那些可以共享的属性提取出来,作为一个享元对象。

python 复制代码
class TreeType:
    def __init__(self, type, color):
        self.type = type
        self.color = color

# 创建一个享元工厂来管理共享的TreeType对象
class TreeFactory:
    _tree_types = {}

    @classmethod
    def get_tree_type(cls, type, color):
        key = (type, color)
        if key not in cls._tree_types:
            cls._tree_types[key] = TreeType(type, color)
        return cls._tree_types[key]

菜鸟:这就像一个缓存池,只创建一次共享的对象。那具体的树对象怎么改呢?

老鸟:我们需要一个包装类,把树的独特属性和共享的属性分开。

python 复制代码
class Tree:
    def __init__(self, type, color, x, y):
        self.tree_type = TreeFactory.get_tree_type(type, color)
        self.x = x
        self.y = y

# 创建很多树对象
trees = [Tree("Oak", "Green", i, j) for i in range(10) for j in range(100)]

菜鸟:这样的话,树的类型和颜色就只保存了一份,大大节省了内存。

问题与反思

菜鸟:我以前会直接创建很多相同的对象,没想到这样可以优化。那享元模式适用于哪些场景呢?

老鸟:享元模式适用于有大量相似对象的场景,比如文字处理程序中的字符对象、游戏中的重复物体等。

优势与适用场景

老鸟:就像图书馆共享书籍副本一样,享元模式可以节省大量内存。适用于资源受限的系统或者需要大量相似对象的应用。

菜鸟:理解了,那使用享元模式有什么需要注意的吗?

常见误区与优化建议

老鸟:需要注意的是,享元模式适合于内部状态较少的对象。如果对象的状态变化频繁,享元模式可能不太适用。另外,管理享元对象的工厂类也需要设计好,避免内存泄漏。

总结与延伸阅读

老鸟:总结一下,享元模式通过共享相似对象的内部状态,减少内存占用。适用于需要大量相似对象的场景。你可以参考《设计模式》这本书,里面有详细的介绍。

菜鸟:谢谢老鸟,这次讲解让我明白了享元模式的应用和优势。我会继续学习其他设计模式的!

老鸟:不客气,设计模式很有用,下一步你可以学习单例模式和工厂模式,它们也很常用。

相关推荐
江沉晚呤时7 小时前
在 C# 中调用 Python 脚本:实现跨语言功能集成
python·microsoft·c#·.net·.netcore·.net core
电脑能手8 小时前
如何远程访问在WSL运行的Jupyter Notebook
ide·python·jupyter
Edward-tan8 小时前
CCPD 车牌数据集提取标注,并转为标准 YOLO 格式
python
老胖闲聊8 小时前
Python I/O 库【输入输出】全面详解
开发语言·python
倔强青铜三9 小时前
苦练Python第18天:Python异常处理锦囊
人工智能·python·面试
DKPT9 小时前
Java设计模式之行为型模式(观察者模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
倔强青铜三9 小时前
苦练Python第17天:你必须掌握的Python内置函数
人工智能·python·面试
迷路爸爸1809 小时前
让 VSCode 调试器像 PyCharm 一样显示 Tensor Shape、变量形状、变量长度、维度信息
ide·vscode·python·pycharm·debug·调试
络710 小时前
Java4种设计模式详解(单例模式、工厂模式、适配器模式、代理模式)
单例模式·设计模式·代理模式·适配器模式·工厂模式
贱贱的剑10 小时前
5.适配器模式
设计模式·适配器模式