结构型设计模式 - 享元模式

【地铁上的设计模式】--结构型模式:享元模式 享元模式是一种结构型设计模式,旨在通过尽可能多地共享内部状态来最大化共享对象的数量,从而减少系统中对象的数量。这种模式适用于需要创建大量细粒度对象的情况,并且它可以大幅降低内存使用和对象创建的开销。在享元模式中,对象可以分为两类:内部状态和外部状态。内部状态是可以共享的,通常保存在享元对象内部,并且不会随着时间的推移而改变。而外部状态则是不可共享的,它通常取决于具体场景,并在运行时传递给享元对象。这种模式的主要思想是在内存中维护一个对象池,用于存储共享的对象。 阅读详情

享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少对象的数量以节省内存或计算成本。该模式的核心思想是共享对象,即将对象的一部分状态外部化,以便多个对象可以共享这部分状态,而其他部分状态则可以独立存储。

结构

享元模式有以下关键角色:

  • Flyweight(抽象享元):定义了享元对象的接口,包含了需要共享的方法。
  • ConcreteFlyweight(具体享元):实现了抽象享元接口,包含了具体需要共享的状态。
  • FlyweightFactory(享元工厂):负责创建和管理享元对象,确保共享对象的正确使用。

代码示例

下面模拟得一个文本编辑器中字符的享元模式应用
在这里插入图片描述

CharFlyweight是抽象享元接口,ConcreteChar是具体享元类,CharFlyweightFactory是享元工厂。客户端创建享元工厂,通过工厂获取字符的享元对象。通过共享字符的状态,可以看到多次获取相同字符的享元对象实际上是同一个对象,从而实现了对象的共享。

import java.util.HashMap;
import java.util.Map;

// Flyweight interface
interface CharFlyweight {
    void display(String font);
}

// ConcreteFlyweight
class ConcreteChar implements CharFlyweight {
    private final char symbol;

    public ConcreteChar(char symbol) {
        this.symbol = symbol;
    }

    public void display(String font) {
        System.out.println("Symbol: " + symbol + ", Font: " + font);
    }
}

// FlyweightFactory
class CharFlyweightFactory {
    private final Map<Character, CharFlyweight> flyweights;

    public CharFlyweightFactory() {
        this.flyweights = new HashMap<>();
    }

    public CharFlyweight getChar(char symbol) {
        if (!flyweights.containsKey(symbol)) {
            flyweights.put(symbol, new ConcreteChar(symbol));
        }
        return flyweights.get(symbol);
    }
}

// Client
public class Main {
    public static void main(String[] args) {
        CharFlyweightFactory charFactory = new CharFlyweightFactory();

        CharFlyweight charA = charFactory.getChar('A');
        CharFlyweight charB = charFactory.getChar('B');
        CharFlyweight charA2 = charFactory.getChar('A');

        charA.display("Arial");
        charB.display("Times New Roman");
        charA2.display("Verdana");
    }
}

优点

  • 内存节省:通过共享对象,减少了对象的数量,降低了内存占用。
  • 性能提升:通过共享对象状态,减少了对象的创建和销毁次数,提升了性能。
  • 灵活性:外部化了对象的状态,使得可以在运行时改变对象的状态而不影响其他对象。

缺点

  • 复杂性增加:引入了外部状态,使得系统变得更加复杂。
  • 可能导致线程安全问题:如果共享的状态不是线程安全的,需要在享元对象或工厂中进行同步处理。

适用场景

  • 系统中有大量相似对象,占用大量内存,且对象的大部分状态可以外部化时。
  • 对象的大多数状态可以变为外部状态,而剩余部分状态可以在对象内部维护时。
  • 需要在多个对象之间共享状态,而且状态是相对独立的。

典型的应用场景包括图形系统、文本编辑器、游戏开发等,其中有大量相似的对象需要被创建和管理。

D类功放几种常见“爆破音”问题根源与改善措施 在数字D类功放刚上电或功放播放状态切换时,人耳偶尔会听到“嘣”的声音,我们把这个爆破的Pop Noise。数字功放Pop Noise 出现的原因有很多,本文主要分析Pop Noise 出现原因,并提供相应解决方法。 阅读详情

相关推荐

历年北京理工大学复试专业综合题

。

A place to record sth. 2万+

【c++设计模式14】结构型6:享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。享元模式将对象分为两部分:内部状态(Intrinsic State)和外部状态(Extrinsic State)。其中,内部状态是可以共享的,而外部状态是不可共享的。

junxuezheng的博客 1135

Unity物理驱动3D汽车实现:从刚体控制到参数调优

在游戏开发中,刚体物理是实现真实物体运动与交互的核心技术。通过Unity的物理引擎,开发者可以模拟重力、碰撞、摩擦力等物理行为,为游戏世界注入真实感。其技术价值在于能够以符合物理规律的方式驱动游戏对象,避免穿墙、无视惯性等问题,从而提升游戏体验的真实性和沉浸感。这一原理广泛应用于角色控制、车辆模拟、物体破坏等场景。本文以3D小汽车为例,详细解析了如何通过Rigidbody组件施加力与扭矩,并利用C#脚本实现玩家输入逻辑,完成一辆可操控、能碰撞的物理驱动汽车。文中重点探讨了AddForce与角速度控制两种方案

weixin_34380948的博客 501

设计模式 结构型 享元模式(Flyweight Pattern)与 常见技术框架应用 解析

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享尽可能多的对象来有效地支持大量的细粒度对象。它的主要目的是减少内存使用和提高性能,特别是当创建大量相似对象时。

JINGWHALE 1557

车载导航GPS欺骗

因此,如果我们能够模拟卫星信号,将模拟的信号通过信号发射装置发送给GPS传感器,那么就有可能实现欺骗GPS传感器获取虚假的位置信息,这种技术即SDR(软件无线电,Software Defined Radio)[2]。究其原因,在不使用时钟模块的条件下,HackRF发送信号的频率可能不十分精准,因此GPS传感器接收到信号之后可能无法正常解析GPS信号,因此时钟信号可能是HackRF进行GPS欺骗的关键。2)HackRF是否使用了时钟模块,时钟模块决定了信号发送频率的精准程度,对实验的成败也是至关重要的。

2503_90751789的博客 1324

激光雷达+相机标定避坑指南:手把手教你用KITTI数据完成坐标转换

本文详细介绍了激光雷达与相机标定的实战指南,利用KITTI数据集完成精准坐标转换。从数据准备、工具链搭建到标定矩阵加载与验证,再到坐标转换流水线的工程实现,提供了全面的避坑技巧和工程实践建议。特别强调了多传感器融合中的常见问题及解决方案,帮助开发者提升自动驾驶和机器人感知系统的环境感知精度。

book8的博客 834

【设计模式】结构型-享元模式

享元模式是一种用于优化内存使用的结构型设计模式,通过共享重复对象来减少内存消耗。它将对象信息分为内部状态(可共享)和外部状态(不可共享),核心组件包括抽象享元、具体享元、享元工厂和客户端。以游戏枪支为例,相同类型的枪只创建一次,通过外部传入坐标实现差异化。该模式适用于大量重复细粒度对象的场景,如游戏开发、基础组件和系统优化,能显著减少对象数量但会增加设计复杂度。与单例模式不同,享元模式允许多个共享对象按类型复用。

大志的学习笔记 799

从数据库到数据仓库:数据仓库导论

本文为数据仓库导论,旨在介绍数据仓库的基本理念和应用场景,帮助读者理解数据仓库的重要性及其在企业中的实际应用。

探索大数据世界 - 深入解析数据存储、分布式计算与人工智能 2784

DesignPattern - 享元模式【结构型】

欢迎关注微信公众号:FSA全栈行动 ???? 一、享元模式介绍 享元模式(Flyweight Pattern)属于结构型模式,主要用于减少创建对象的数量,以减少内存占用和提高性能,它提供了减少对象数量从而改善应用所需的对象结构的方式;享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。 状态 内部状态:不会随环境的改变而所有不同,是可以共享的 外部状态:它随环境的改变而改变的,是不可以共享的,因此外部状态是由客户端来保持(因为环境的变化一般是由客户端引起) 核心组成 抽象享元

GitLqr的博客 296

全球SAR卫星大盘点与回波数据处理专栏目录

本专栏将详细介绍各国各地区的SAR卫星的特点和性能,以及SAR回波数据的处理方法和技巧。主要介绍民用和商用SAR卫星,帮助你了解商业SAR卫星的最新动态和技术,MATLAB代码将全部开源。以下是专栏目录,持续更新中。

3161

3、硬件工程师笔试面试学习汇总——器件篇目录(2025版本)

硬件工程师笔试面试学习

XU157303764的博客 7620

享元模式(Flyweight Pattern) – 设计模式之结构型模式

享元模式(Flyweight Pattern) – 设计模式之结构型模式: 享元模式(Flyweight Pattern) 定义: Use sharing to support large numbers of fined-grained objects efficiently. 运用共享技术有效地支持大量细粒度的对象 要求细粒度对象,那么不可避免地使得对象数量多且性质相近,那我们就将这些对象的信息分为两个部分:内部状态(intrinsic)与外部状态(extrinsic)。 1 内部状态 .

一路向前 404

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力 (论文笔记+引入代码)。LSKNet能够动态调整其大的空间接收场,以更好地模拟遥感场景中各种对象的范围上下文。据我们所知,这是首次在遥感目标检测领域探索大型和选择性核机制。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 2864

结构型设计模式——享元模式

享元模式是结构型模式中最简单的一个模式,享是共享的意思,元是最小单元或细小的对象的意思。也就是说对一些需要大量重复使用的很细的对象进行缓存,缓存了就可以重复使用,例如Integer类中对整型-128到127进行了缓存,使用的正是享元模式。它有点类似单例模式,不过单例模式只共享一个类的唯一对象,而享元模式是共享多个类的唯一对象。 给出定义如下:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。

Cheney的博客 1369

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

设计模式——结构型之享元模式

设计模式——结构型之享元模式 如果一个类的大量实例的部分属性都相同,就把这些属性抽离成新类,这样的类结构叫享元模式 享元模式就是不同实例的成员变量共享同一个实例,降低内存占用 但是由于享元模式缓存的对象不会被jvm回收,除非验证过有性能提升,否则不要滥用 享元模式由3部分组成: 相同的享元类,由从原始类中抽离的成员变量组成 有差异的原始类 工厂类,缓存和构建享元类 享元类: public class FlyWeight { private String paramA; private

大造梦家的博客 343

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

设计模式 - 结构型 - 享元模式(Flyweight Pattern)

有效应对大规模对象场景下的资源消耗问题。其核心价值在于平衡内存占用与性能,但需注意状态划分的合理性与线程安全。在涉及高并发或资源敏感型系统(如游戏、编辑器)中,合理应用享元模式可显著提升效率,但需避免过度设计导致复杂度失控。(内部状态)来支持大量细粒度对象的复用,而可变状态(外部状态)由客户端维护,从而减少重复对象的创建。例如,在文档编辑器中,字符的字体、颜色作为内部状态共享,而位置坐标作为外部状态独立管理。,通过共享对象来减少内存占用,特别适用于存在大量相似对象的场景。,通过共享内部状态降低资源消耗。

csdn_tom_168的博客 488

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【设计模式-结构型】享元模式

享元模式对应生活中的共享商业模式,目的为了优化资源的使用。

qq_36038282的博客 1264

【C#设计模式】11.享元模式(Flyweight Pattern)【结构型】

1.1 动机(Motivate) 在软件系统中,采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作? 1.2 意图(Intent) 运用共享技术有效地支持大量细粒度的对象。       ——《设计模式》GoF ............

星Yeah 的博客 2111

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享相同对象来减少内存使用

- 享元工厂负责创建和管理享元对象。它通常有一个存储享元对象的池(如哈希表等数据结构),当需要一个享元对象时,先从池中查找,如果存在则直接返回;如果不存在,则创建一个新的享元对象并放入池中。例如在网络围棋程序中,享元工厂可以根据棋子的颜色创建相应的棋子对象,并且在多个玩家使用相同颜色的棋子时,重复使用已创建的棋子对象。

[Blog][Domain] programb.blog.youkuaiyun.com 742

Java GoF 23种设计模式-结构型模式-享元模式(Flyweight Pattern)

文章目录一、模式定义二、模式动机三、模式结构四、单纯享元模式4.1、类图结构4.1、代码实现 一、模式定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式,必须有一个工厂类对享元对象进行管理和扩展,工厂尝试重用现有的同类对象,如果未找到匹配的对象,再创建新对象。 二、模式动机 在创建大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,保存在内存中

WU4566285的博客 496

设计模式 ~ 结构型模式 ~ 享元模式 ~ Flyweight Pattern。

设计模式 ~ 结构型模式 ~ 享元模式 ~ Flyweight Pattern。

lyfGeek的博客 220

【Java 设计模式 · 结构型】享元模式(Flyweight Pattern)

享元模式(FlyWeight Pattern):运用共享技术有效地支持大量细粒度对象的复用。

茶色喵的博客 403

设计模式(结构型)之享元模式(Flyweight Pattern)

享元工厂角色负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键!客户端角色维护对所有享元对象的引用,而且还需要存储对应的外部状态。单纯享元模式和创建型的简单工厂模式实现上非常相似,但是它的重点或者用意却和工厂模式截然不同。工厂模式的使用主要是为了使系统不依赖于实现得细节;而在享元模式的主要目的是避免大量拥有相同内容对象的开销。抽象享元角色为具体享元角色规定了必须实现的方法,而外部状态就是以参数的形式通过此方法传入。在Java中可以由抽象类、接口来担当。具体享元角色。

2401_86637504的博客 911

C#设计模式之十一享元模式(Flyweight Pattern)【结构型】

C#设计模式之十一享元模式(Flyweight Pattern)【结构型】 原文:C#设计模式之十一享元模式(Flyweight Pattern)【结构型】一、引言 今天我们要讲【结构型】设计模式的第六个模式,该模式是【享元模式】,英文名称是:Flyweight Pattern。还是老套路,先从名字上来看看。“享元”是不是可以这样理解,共享...

weixin_30808575的博客 91

享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少创建对象的数量,从而减少内存占用和提高性能

享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少创建对象的数量,从而减少内存占用和提高性能。享元模式的核心思想是通过共享已存在的对象来避免重复创建相同或相似的对象,从而节省内存。假设我们有一个文本编辑器,支持多种字体和颜色。我们可以使用享元模式来减少字体对象的数量,从而节省内存。 3.2 实现具体享元类 3.3 实现享元工厂 3.4 客户端代码 4. 输出结果 运行客户端代码,输出结果如下: 5. 享元模式的优点 节省内存:通过共享已存在的对象,减少创建对象的数量,从而节

[Blog][Domain] programb.blog.youkuaiyun.com 1015

C++设计模式结构型模式———享元模式

享元对象最重要的就是对“内部状态”和“外部状态”做出了明确的区分,这是享元对象能够被共享的关键所在。内部状态:存储在享元对象内部的,一直不会发生改变的状态,这种状态可以被共享。例如,对于BlackPiece类对象,它的内部状态就是黑棋子,它一直代表黑棋子,不会发生改变。而对于WhitePiece类对象,它的内部状态就是白棋子,它一直代表白棋子,不会发生改变。内部状态一般可以作为享元类的成员变量而存在。外部状态:随着着外部环境和各种动作因素的改变而发生改变的状态,这种状态不可以被共享。

无敌岩雀的博客 1571
上一篇: 结构型设计模式 - 外观模式
下一篇: 结构型设计模式 - 代理模式
#难得糊涂
博客等级 码龄8年 231粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值