享元模式探究
起源定义例子应用使用条件创建一个享元类单例模式+享元类PS
起源
面向对象的系统面临由于对象创建的性能问题,因为要同时创建大量对象(类实例),而且这些对象必须同时存在, 系统的内存被大量占用。除了内存考虑外,图形的渲染性能也是使用享元模式的初衷。
定义
通过为相似的对象引入数据共享来最小化内存使用和提升性能。一个享元(Flyweight)就是一个状态独立的不可变数据的共享对象(一旦创立不可修改?)而可变的对象数据不应该是享元的一部分。
例子
第一人称射击游戏中,玩家之间会共享一些相同的状态,比如跳起,低头等相似的行为。还有就是同一个团队中,士兵们的服饰相同
应用
使用条件
应用需要使用大量对象,且对象需要同时存在对象之间可以通过共享元素来分组,且可变状态较少对象ID对于应用不重要,不需要比较对象之间的相同或者不同
创建一个享元类
class Tree:
pool
= dict()
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
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
享元是程序中类实例的管理方式,目的是为了更有效的使用内存和提高渲染效率(使用同一个对象来达成不同的渲染结果, 渲染需要的可变元素由外部提供) 享元不是一种类设计方式,要和类继承中,共享元素和可变元素设计区分开来。