结构型模式之享元模式

    xiaoxiao2022-07-03  112

    享元模式探究

    起源定义例子应用使用条件创建一个享元类单例模式+享元类PS

    起源

    面向对象的系统面临由于对象创建的性能问题,因为要同时创建大量对象(类实例),而且这些对象必须同时存在, 系统的内存被大量占用。除了内存考虑外,图形的渲染性能也是使用享元模式的初衷。

    定义

    通过为相似的对象引入数据共享来最小化内存使用和提升性能。一个享元(Flyweight)就是一个状态独立的不可变数据的共享对象(一旦创立不可修改?)而可变的对象数据不应该是享元的一部分。

    例子

    第一人称射击游戏中,玩家之间会共享一些相同的状态,比如跳起,低头等相似的行为。还有就是同一个团队中,士兵们的服饰相同

    应用

    使用条件

    应用需要使用大量对象,且对象需要同时存在对象之间可以通过共享元素来分组,且可变状态较少对象ID对于应用不重要,不需要比较对象之间的相同或者不同

    创建一个享元类

    class Tree: pool = dict() # 在__init__之前被调用, tree_type 是group的共享属性 def __new__(cls, tree_type): obj = cls.pool.get(tree_type, None) if not obj: obj = object.__new__(cls) # 创建类实例 cls.pool[tree_type] = obj obj.tree_type = tree_type return obj # 需要一个__init__来添加可变元素 def __init__(self, name): self.name = name # 还可以继续定义其他类实例方法

    单例模式+享元类

    class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = object.__new__(cls) return cls._instance

    PS

    享元是程序中类实例的管理方式,目的是为了更有效的使用内存和提高渲染效率(使用同一个对象来达成不同的渲染结果, 渲染需要的可变元素由外部提供) 享元不是一种类设计方式,要和类继承中,共享元素和可变元素设计区分开来。

    最新回复(0)