news 2026/4/23 19:21:06

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/23 16:06:25

什么是M-LAG

文章目录为什么需要M-LAG如何实现M-LAG组网M-LAG是如何工作的如何应用M-LAG技术M-LAG(Multichassis Link Aggregation Group)提供一种跨设备链路聚合的技术。M-LAG通过将两台接入交换机以同一个状态和用户侧设备或服务器进行跨设备的链路聚合&#xff0c…

作者头像 李华
网站建设 2026/4/23 14:44:49

线性规划优化:单纯形法

原文:towardsdatascience.com/linear-programming-optimization-the-simplex-method-b2f912e4c6fd 到目前为止,本系列已经涵盖了线性规划的基础知识。在本文中,我们将从基本概念转向底层的细节!本文将介绍单纯形法,这是…

作者头像 李华
网站建设 2026/4/23 11:33:50

springboot集成Jasypt实现配置文件启动时自动解密-ENC

SpringBoot本身并没有自动加解密的功能&#xff0c;平时项目启动时&#xff0c;自动解密配置文件里ENC( )包含的数据&#xff0c;原因是使用了Jasypt&#xff08;Java Simplified Encryption&#xff09;。一、前置条件&#xff0c;maven引入依赖<!-- Spring Boot集成Jasypt…

作者头像 李华
网站建设 2026/4/23 8:46:52

SpringBoot+Vue 甘肃非物质文化网站平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

摘要 甘肃非物质文化遗产作为中华优秀传统文化的重要组成部分&#xff0c;承载着丰富的历史文化信息和民族智慧。随着信息技术的快速发展&#xff0c;传统的非遗保护方式已难以满足现代社会的需求&#xff0c;数字化保护与传承成为重要趋势。本项目旨在构建一个基于SpringBoot和…

作者头像 李华
网站建设 2026/4/23 12:58:41

基于IWOA-CNN-BiLSTM-Attention多变量时序预测 Matlab代码

目录 1、代码简介 2、代码运行结果展示 3、代码获取 1、代码简介 [独家原创]基于IWOA-CNN-BiLSTM-Attention多变量时序预测 Matlab代码 改进点&#xff1a;三个(附赠参考文献)--------【如需优化算法(IWOA)测试函数&#xff0c;额外加20】 1、准反向学习---来初始化种群 …

作者头像 李华
网站建设 2026/4/22 19:47:39

扔掉 K8s 和 YAML 后,我的团队上线速度快了 10 倍

我一直在思考一个问题&#xff1a;为什么在容器化如此普及的今天&#xff0c;部署应用依然是一件让许多团队头疼的难事&#xff1f;我们用 AI 加速了“写代码”&#xff0c;但工程师大量的时间&#xff0c;却消耗在了写代码之外的、那些看不见的“摩擦”上。我认为&#xff0c;…

作者头像 李华