news 2026/4/13 19:41:41

Python设计模式:享元模式详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python设计模式:享元模式详解

享元模式的核心思想

享元模式(Flyweight Pattern)通过共享对象减少内存占用,适用于存在大量重复对象的场景。其核心是将对象的内在状态(可共享)与外在状态(不可共享)分离,通过共享内在状态优化资源。

享元模式的结构

  • Flyweight(抽象享元类):定义共享对象的接口。
  • ConcreteFlyweight(具体享元类):实现抽象享元类,存储内在状态。
  • FlyweightFactory(享元工厂类):管理享元对象池,确保对象被合理共享。
  • Client(客户端):维护外在状态,调用享元对象。

实现步骤

定义抽象享元接口

from abc import ABC, abstractmethod class Flyweight(ABC): @abstractmethod def operation(self, extrinsic_state): pass

实现具体享元类

class ConcreteFlyweight(Flyweight): def __init__(self, intrinsic_state): self._intrinsic_state = intrinsic_state # 内在状态(共享部分) def operation(self, extrinsic_state): print(f"Shared: {self._intrinsic_state}, Unique: {extrinsic_state}")

享元工厂管理共享

class FlyweightFactory: _flyweights = {} # 享元对象池 @classmethod def get_flyweight(cls, key): if key not in cls._flyweights: cls._flyweights[key] = ConcreteFlyweight(key) return cls._flyweights[key]

客户端使用示例

factory = FlyweightFactory() flyweight_a = factory.get_flyweight("A") # 首次创建并缓存 flyweight_b = factory.get_flyweight("A") # 直接复用 flyweight_a.operation("state1") # 输出: Shared: A, Unique: state1 flyweight_b.operation("state2") # 输出: Shared: A, Unique: state2

应用场景

  • 文本编辑器:字符对象共享(如字母“A”只需一个实例)。
  • 游戏开发:大量相同粒子效果(如子弹、树木)。
  • 数据库连接池:复用连接对象减少开销。

https://www.zhihu.com/zvideo/1992404649416885618/
https://www.zhihu.com/zvideo/1992404649920189696/
https://www.zhihu.com/zvideo/1992404646791230854/
https://www.zhihu.com/zvideo/1992404644815717039/
https://www.zhihu.com/zvideo/1992404644379509727/
https://www.zhihu.com/zvideo/1992404644689904603/
https://www.zhihu.com/zvideo/1992404642911524051/
https://www.zhihu.com/zvideo/1992404641779045977/
https://www.zhihu.com/zvideo/1992404634623574368/
https://www.zhihu.com/zvideo/1992404634430628805/
https://www.zhihu.com/zvideo/1992404632442521330/
https://www.zhihu.com/zvideo/1992404630768985959/
https://www.zhihu.com/zvideo/1992404630718677966/
https://www.zhihu.com/zvideo/1992404629833655108/
https://www.zhihu.com/zvideo/1992404629024166713/
https://www.zhihu.com/zvideo/1992404622791423661/
https://www.zhihu.com/zvideo/1992404628856411164/
https://www.zhihu.com/zvideo/1992404627975591820/
https://www.zhihu.com/zvideo/1992404626985730132/
https://www.zhihu.com/zvideo/1992404626289493675/
https://www.zhihu.com/zvideo/1992404621709291853/
https://www.zhihu.com/zvideo/1992404621038217121/
https://www.zhihu.com/zvideo/1992404618005733708/
https://www.zhihu.com/zvideo/1992404614432170789/
https://www.zhihu.com/zvideo/1992404615543690944/
https://www.zhihu.com/zvideo/1992404614176321614/
https://www.zhihu.com/zvideo/1992404609315132028/
https://www.zhihu.com/zvideo/1992404589270550149/
https://www.zhihu.com/zvideo/1992404587995496693/
https://www.zhihu.com/zvideo/1992404585013326088/
https://www.zhihu.com/zvideo/1992404583436268816/
https://www.zhihu.com/zvideo/1992404582639372230/
https://www.zhihu.com/zvideo/1992404581980865776/
https://www.zhihu.com/zvideo/1992404580936484701/
https://www.zhihu.com/zvideo/1992404580231844821/
https://www.zhihu.com/zvideo/1992404576171741283/
https://www.zhihu.com/zvideo/1992404574590506269/
https://www.zhihu.com/zvideo/1992404575051858971/
https://www.zhihu.com/zvideo/1992404575232213305/
https://www.zhihu.com/zvideo/1992404574632424027/
https://www.zhihu.com/zvideo/1992404574498215281/
https://www.zhihu.com/zvideo/1992404567258854271/
https://www.zhihu.com/zvideo/1992404571532836993/
https://www.zhihu.com/zvideo/1992404571440562947/
https://www.zhihu.com/zvideo/1992404571021123672/
https://www.zhihu.com/zvideo/1992404557834245543/
https://www.zhihu.com/zvideo/1992404559025443249/
https://www.zhihu.com/zvideo/1992404556550797057/
https://www.zhihu.com/zvideo/1992404547432370347/

优缺点分析

优点

  • 显著减少内存消耗,提升性能。
  • 通过集中管理享元对象,降低系统复杂度。

缺点

  • 需要分离内在/外在状态,增加设计难度。
  • 过度共享可能导致线程安全问题。

与其他模式对比

  • 单例模式:享元关注对象共享,单例强制全局唯一实例。
  • 对象池模式:享元强调状态分离,对象池侧重生命周期管理。

通过合理使用享元模式,可高效处理大量细粒度对象的共享问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 0:52:12

Agentic AI提示工程可解释性增强:重要方法与实际应用

Agentic AI提示工程可解释性增强:重要方法与实际应用 一、引入与连接:当AI Agent学会"说清楚" 凌晨2点,急诊室的李医生盯着电脑屏幕上的诊断报告,眉头紧皱。 “患者高烧39℃、咳嗽伴呼吸困难,AI Agent建议诊…

作者头像 李华
网站建设 2026/3/30 3:55:06

滤波前后对比图

% 读取数据 pwr freadbkj(../rmli/rmli.ave, 5902, float32, b);% 原始干涉图数据 phase_complex freadbkj(20091226_20100515.diff, 5902, cpxfloat32, b); cc freadbkj(20091226_20100515.cc, 5902, float32, b);% ADF处理后的干涉图数据 adf_phase_complex freadbkj(200…

作者头像 李华
网站建设 2026/4/13 8:38:01

狂揽23.5k Star!我用这个开源神器,拖拉拽3分钟就撸好一个AI Agent

AI 时代,谁都想构建一个自己的 AI 应用,比如一个能读取 PDF 内容并回答问题的机器人,或者一个自动生成营销文案的工具。但一想到要跟 LangChain、API 接口和复杂的 Python 代码打交道,我就头皮发麻。难道不懂代码,就注…

作者头像 李华
网站建设 2026/4/7 16:33:48

SQLi-Labs搭建及通关

**在 Windows 电脑上安装 sqlmap 并搭建 SQLi-Labs,需要先配置Python 环境(支撑 sqlmap)和XAMPP 环境(集成 ApacheMySQLPHP,支撑 SQLi-Labs)。 一、工具下载: 1、Python(sqlmap 依赖…

作者头像 李华