享元模式
享元模式的核心思想是通过共享技术减少大量细粒度对象的创建,降低内存占用并提升性能。换句话说,它通过分离对象的内部状态(可共享的固有属性)和外部状态(随场景变化的属性)实现对象复用。
特点
对象复用:通过共享池管理可复用的对象,避免重复创建 内存优化:减少内存占用,提升性能 状态分离:
内部状态:对象固有的、可共享的属性 外部状态:对象依赖外部环境的参数,随场景变化的属性
模式结构
角色 描述 抽象享元 (Flyweight) 定义享元对象的接口,声明一个用于外部状态的接口 具体享元 (ConcreteFlyweight) 实现抽象享元接口,定义内部状态,通常为不可变的 享元工厂 (FlyweightFactory) 创建和存储享元对象的工厂类,确保相同内部状态的对象唯一 客户端 (Client) 维护外部状态,通过享元工厂获取享元对象并调用其方法
简单示例
class AirplaneInterface :
def flight_route ( self, city_a, city_b) : pass
class Airplane ( AirplaneInterface) :
def __init__ ( self, manufacturer, model) :
self. manufacturer = manufacturer
self. model = model
def flight_route ( self, city_a, city_b) :
print ( f" { self. manufacturer} { self. model} is flying from { city_a} to { city_b} ." )
class AirplaneFactory :
_airplanes = { }
@classmethod
def get_airplane ( cls, manufacturer, model) :
if f" { manufacturer} { model} " not in cls. _airplanes:
cls. _airplanes[ f" { manufacturer} { model} " ] = Airplane( manufacturer, model)
return cls. _airplanes[ f" { manufacturer} { model} " ]
if __name__ == "__main__" :
factory = AirplaneFactory( )
B787 = factory. get_airplane( "Boeing" , "787" )
B787. flight_route( "New York" , "Los Angeles" )
B747 = factory. get_airplane( "Boeing" , "747" )
B747. flight_route( "Tokyo" , "Shanghai" )
B787_2 = factory. get_airplane( "Boeing" , "787" )
print ( f"B787 和 B787_2 是同一个对象: { B787 is B787_2} " )
B747_2 = factory. get_airplane( "Boeing" , "747" )
print ( f"B747 和 B747_2 是同一个对象: { B747 is B747_2} " )
print ( f"享元池中享元对象的数量: { len ( factory. _airplanes) } " )
应用场景
存在大量相似对象时(图型渲染、样式配置) 对象大部分状态可外部化,且外部状态变化频繁时(数据库连接对象)
优缺点
优点:
缺点
内外状态分离,提高了代码复杂度 共享对象要求线程安全
享元模式 VS 单例模式
维度 享元模式 单例模式 核心目的 共享内部状态减少对象创建,减少内存占用 保证全局唯一 对象数量 允许存在多个实例(但相同内部状态的实例唯一) 严格要求只有一个实例 状态管理 区分内部状态(共享)和外部状态(客户端传递) 所有状态都为内部状态,但全局共享 线程安全 需要注意 懒汉式需要,饿汉式不需要 设计复杂度 需要先区分内外状态,设计共享池 简单 应用场景 存在大量相似对象时 全局唯一对象