当前位置: 首页 > news >正文

享元模式

1.模式动机与定义

模式动机

享元模式:通过共享技术实现相同或相似对象的重用

享元池(Flyweight Pool):存储共享实例对象的地方

模式定义

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。
系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用
由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式

2.模式结构与分析

模式结构

享元模式包含如下角色

  • Flyweight:抽象亨元类:抽象享元类声明一个接口,通过它可以接受并作用于外部状态。在抽象享元类中定义了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据,也可以来设置外部数据。
  • ConcreteFlyweight: 具体享元类:具体享元类实现了抽象享元接口,在具体享元类中为内部状态提供了存储空间。由于具体享元对象必须是可以共享的,因此它所存储的状态必须是内部的,即它独立存在于自己的环境中。
  • UnsharedConcreteFlyweight: 非共享具体享元类:并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类则设计为非共享具体享元类。
  • FlyweightFactory: 享元工厂类:享元工厂类用于创建并管理享元对象;它针对抽象享元类编程,将各类的具体享元对象存储在一个享元池中。享元池一般设计为一个存储键值对的集合,可以结合工厂模式进行设计;当用户请求一个具体享元对象时,享元工厂提供一个存储在享元池中已创建的实例,或者创建一个新的实例,返回该新创建的实例并将其存储在享元池中。

模式分析

享元模式的核心在于享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。

  • 内部状态(Intrinsic State):存储在享元对象内部并且不会随环境改变而改变的状态,内部状态可以共享(例如:字符的内容)
  • 外部状态(Extrinsic State):随环境改变而改变的、不可以共享的状态。享元对象的外部状态通常由客户端保存,并在享元对象被创建之后,需要使用的时候再传入到享元对象内部。一个外部状态与另一个外部状态之间是相互独立的(例如:字符的颜色和大小)

实现过程

  1. 将具有相同内部状态的对象存储在享元池中,享元池中的对象是可以实现共享的
  2. 需要的时候将对象从享元池中取出,即可实现对象的复用
  3. 通过向取出的对象注入不同的外部状态,可以得到一系列相似的对象而这些对象在内存中实际上只存储一份
//抽象享元类的子类
public class ConcreteFlyweight extends Flyweight {//内部状态intrinsicState作为成员变量,同一个享元对象其内部状态是一致的private String intrinsicState;public ConcreteFlyweight(StringintrinsicState){this.intrinsicState= intrinsicState;}//外部状态extrinsicState在使用时由外部设置,不保存在享元对象中,即使是同一个对象,在每一次调用时可以传入不同的外部状态publie void operation(String extrinsicState){//实现业务方法}
}//保存和管理享元对象的类
public class FlyweightFactory {//定义一个HashMap用于存储享元对象,实现享元池private HashMap flyweights= new HashMap();public Flyweight getFlyweight(String key){//如果对象存在,则直接从享元池获取if (flyweights.containsKey(key)){return (Flyweight)flyweights.get(key);}//如果对象不存在,先创建一个新的对象添加到享元池中,然后返回}else {Flyweightfw= new ConcreteFlyweight();flyweights.put(key,fw);return fw;}
}

3.模式效果与应用

优点

  • 可以减少内存中对象的数量,使得相同或者相似的对象在内存中只保存一份,从而可以节约系统资源,提高系统性能
  • 外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享

缺点

  • 使得系统变得复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化
  • 为了使对象可以共享,享元模式需要将享元对象的部分状态外部化,而读取外部状态将使得运行时间变长

使用情况

  • 一个系统有大量相同或者相似的对象,造成内存的大量耗费
  • 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中
  • 在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,在需要多次重复使用享元对象时才值得使用享元模式

模式应用

  1. 享元模式在编辑器软件中大量使用,如在一个文档中多次出现相同的图片,则只需要创建一个图片对象,通过在应用程序中设置该图片出现的位置,可以实现该图片在不同地方多次重复显示。
  2. 在JDK类库中定义的String类使用了享元模式
http://www.jsqmd.com/news/200857/

相关文章:

  • 如何保证rabbitmq或kafka 消息不丢失,从生产到消费端全过程
  • 数眼智能搜索 API VS 安思派搜索 API,谁是 AI 应用的最佳信息搭档?
  • TX Text Control ActiveX 34.0 FIX
  • LangGraph人机协同(HITL)实战:三种核心模式详解+企业部署避坑指南
  • C# 基于OpenCv的视觉工作流-章5-自动二值化
  • 云购系统介绍
  • 【图像分解】基于粒子群优化的匹配追踪图像稀疏分解算法的MATLAB实现
  • Prompt工程核心技巧:三步让AI精准理解你的需求,小白也能秒上手
  • **竞争资源**:当多个进程共享系统资源(如内存、I/O设备、文件等),而资源数量不足以满足所有进程的需求时
  • FastGPT完全部署指南:从零搭建大语言模型知识平台
  • qmlRegisterType 详解
  • 死锁避免与银行家算法的核心在于通过动态检测资源分配后的系统状态是否处于“安全状态”,从而决定是否允许资源分配
  • 1.5.3
  • 5分钟用AI搞定顶刊级引言!掌握三段式结构+避坑要点,让你的Introduction更有说服力(附提示词)
  • 所有权之谜:为什么鲸鱼濒临灭绝,鸡却没有繁衍之忧?
  • 针对Ubuntu 22.04服务器开机黑屏无图形界面的问题,如果 nomodeset 不行,下次可以尝试换成 nvidia-drm.modeset=1【笔记】
  • GEO报告一键生成工具:从数据采集到分析闭环
  • 转行大模型产品经理:5大核心能力+6个月学习路线,月薪30K+不是梦_2026年零基础转行大模型产品经理必备
  • 飞致云 jumpserver安装
  • 学霸同款9个AI论文平台,专科生轻松搞定毕业论文!
  • I知识库实操指南:构建适配 AI 的知识系统
  • Bamtone班通:盲孔显微镜有哪些行业应用?能解决什么问题?
  • Cron-Job:超好用的分布式任务调度平台,低延迟还支持多租户
  • 所有权之谜:为什么没有一流的营利性大学?
  • Git Restore 命令教程
  • Aviator表达式引擎:凭啥子在一堆开源引擎里杀出重围
  • 大模型提示词技巧全解析:释放AI无限潜能
  • RAG搭建个人LLM知识库助手,很多人第一步就走错了...
  • 产品经理必学!掌握大模型技术的5大核心优势,建议收藏_【大模型时代】产品经理为何必须学习大模型?
  • 进阶数据结构-AC自动机 - 详解