结构型模式之享元模式(Flyweight)

SAP PS模块预算控制实战:为什么你的采购订单金额和预算占用对不上? 本文深入解析SAP PS模块中采购订单金额与预算占用偏差的常见问题,揭示承诺成本与实际成本的分流处理机制。通过实战案例和六步定位法,提供发票拆分、跨年度预算等典型场景的解决方案,并分享预防性配置框架和最佳实践,帮助企业有效控制预算偏差。 阅读详情

享元模式的作用在于节省内存开销,对于系统内存在的大量相似的对象,通过享元的设计方式,可以提取出可共享的部分,将其只保留一份进而节省大量的内存开销。

并不是所有的对象都适合进行享元设计,它要求对象具有可共享的特征,这些可共享的特征可以做享元设计,对象的可共享特征比例越大,进行享元设计后节省的内存越多。

注意,对象的不可共享特征不能计入享元设计,所以需要仔细判断区分对象的可共享特征与不可共享特征。


外部特征,不可共享特征,保证调用过程不会影响下次调用。

============================

游戏开发中的享元设计:

一次炮弹的发射过程有这些特征:炮弹外观图片、飞行轨迹、爆炸效果、伤害值等,炮弹是被频繁发射的,如果每发射一个炮弹都创建一个对象,那么喜欢散弹枪的玩家会创建数不清的炮弹对象,这样就会给系统造成很大内存压力。

其实仔细分析一下,炮弹虽然发射了很多,但其实他们都可以共享一个对象,就是炮弹对象本身(包括外观图片、特效图片、爆炸效果等,这些都是可共享特征),不同的是炮弹的运行轨迹(不可共享特征)而已,轨迹是个很小的对象或方法的参数而已不会对系统造成负担,这样的享元设计就可以大量节省内存。

============================


场景:一家饮品小厅,可以提供咖啡、茶、水3种饮料,客人会选择坐几号桌子并点一杯饮品,之后饮品为客人服务(即被慢慢地喝掉)。

分析:在现实生活中,每个客人会选择一杯饮品,每个人的饮品肯定不是同一杯,但是在程序运行过程中,完全可以使用同一个对象来实现,饮品本身存在的可共享特征(如成分、毫升、冷热等)都可计入到享元设计中,饮品要服务的对象(如几号桌哪个人)属于不可共享特征不能计入享元设计。


设计:

示例代码:

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

class ServiceContext {
    private int tableIndex;
    private String customerName;
    public ServiceContext(int tableIndex, String customerName) {
        this.tableIndex = tableIndex;
        this.customerName = customerName;
    }
    public int getTableIndex() {
        return tableIndex;
    }
    public String getCustomerName() {
        return customerName;
    }
}
interface Drink {
    void provideService(ServiceContext serviceContext);
}
class Coffee implements Drink {
    public Coffee() {
        System.out.println("Coffee is created.");
    }
    @Override
    public void provideService(ServiceContext serviceContext) {
        System.out.println("Coffee is serving for table " + serviceContext.getTableIndex() + " customer " + serviceContext.getCustomerName());
    }
}
class Tea implements Drink {
    public Tea() {
        System.out.println("Drink is created.");
    }
    @Override
    public void provideService(ServiceContext serviceContext) {
        System.out.println("Drink is serving for table " + serviceContext.getTableIndex() + " customer " + serviceContext.getCustomerName());
    }
}
class Water implements Drink {
    public Water() {
        System.out.println("Water is created.");
    }
    @Override
    public void provideService(ServiceContext serviceContext) {
        System.out.println("Water is serving for table " + serviceContext.getTableIndex() + " customer " + serviceContext.getCustomerName());
    }
}
class DrinkFactory {
    private Map<String, Drink> drinks = new HashMap<>();
    public Drink createDrink(String type) {
        Drink drink = drinks.get(type);
        if (drink == null) {
            // 以下可以考虑抽象工厂模式实现以符合开闭原则,也可以使用反射
            if (type.equals("Water")) {
                drink = new Water();
            } else if (type.equals("Tea")) {
                drink = new Tea();
            } else if (type.equals("Coffee")) {
                drink = new Coffee();
            }
            drinks.put(type, drink);
        }
        return drink;
    }
}
public class WaiterTest {
    public static void main(String[] args) {
        String[] types = {"Water", "Tea", "Coffee"};
        DrinkFactory drinkFactory = new DrinkFactory();
        for (int i = 1; i <= 9; i++) {
            Drink drink = drinkFactory.createDrink(types[i % 3]);// Drink 可共享特征 在 DrinkFactory 内部实现享元
            ServiceContext serviceContext = new ServiceContext(i, "Sir" + i);// 服务细节为不可共享特征,不能享元
            drink.provideService(serviceContext);//外部特征,不可共享特征,保证调用过程不会影响下次调用。
        }
    }
}
输出:

Drink is created.
Drink is serving for table 1 customer Sir1
Coffee is created.
Coffee is serving for table 2 customer Sir2
Water is created.
Water is serving for table 3 customer Sir3
Drink is serving for table 4 customer Sir4
Coffee is serving for table 5 customer Sir5
Water is serving for table 6 customer Sir6
Drink is serving for table 7 customer Sir7
Coffee is serving for table 8 customer Sir8
Water is serving for table 9 customer Sir9
可以看出:在9次的服务过程中,饮品只创建了三次,一种饮品都仅仅创建了一次,减小了很多内存开销,服务可以很好的进行。
这就是享元模式的精髓,但务必注意区分出可共享与不可共享部分,保证不可共享部分在使用之后不会影响下次使用,即不会改变可共享部分。
YOLOv11 损失函数进阶:SlideLoss 让小目标检测精度飙升 创建self.loss_fun = loss_fun # 基础损失函数(如BCEWithLogitsLoss)self.loss_coef = loss_coef # 损失系数# 计算滑动权重:根据预测与真实值的差异判断样本难度# 难度越高,权重越大该类在原有损失函数的基础上,通过diff计算样本预测与真实值的差异(差异越大,样本越难),进而生成动态权重,实现对难样本的重点学习。 阅读详情

相关推荐

DIY玩家必备:用SSS1623芯片打造高性价比USB麦克风(附完整电路图)

本文详细介绍了如何利用SSS1623芯片DIY高性价比USB麦克风,包括元件选型、电路设计、PCB布局及调试技巧。通过完整的电路参考设计和实用建议,帮助电子爱好者打造专业级录音设备,实现免驱动即插即用功能。

weixin_29166013的博客 239

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

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

junxuezheng的博客 1135

从零开始学习信号完整性(SIPI)--2

上一节我们已经谈过,信号完整性研究的是如何使驱动器输出的信号传输到接收器件并被正确的接收。 信号完整性的三要素包含了:信号、驱动接收芯片、传输通道。 这其中信号是主体,我们要做的主要工作就是设计好信号的传输路径为信号的正确传输扫清障碍。要做信号完整性分析与设计首先要了解信号的特性,以及信号质量的判别标准。 对一个信号进行描述通常需要如下几个指标: 信号特性的描述 摆幅:信号从低电平到高电平之间的电压差,对于单端信号通常由信号的供电电压决......

qq_29476769的博客 2万+

结构型模式——享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)又称轻量级模式属于结构型模式。主要用于减少创建对象的数量,以减少内存占用和提高性能。 Integer使用该模式所对应部分代码的分析。

qq_46658171的博客 823

一步一步搭建S32K14x的AutoSar项目----S32DS 代码工程的搭建

一步一步搭建S32K14X的AutoSar项目----S32DS代码工程的搭建

wo580231的博客 3487

SAP SD销售订单抬头自定义字段增强:BADI_SLS_HEAD_SCR_CUS实战指南

SAP ERP系统中的销售订单管理是企业核心业务流程,经常需要扩展标准功能来满足个性化业务需求。在SAP SD模块中,销售订单抬头屏幕的增强是常见需求。通过BADI(Business Add-In)技术,可以在不修改标准代码的前提下,实现自定义字段的添加与数据处理。本文详细介绍了如何使用BADI_SLS_HEAD_SCR_CUS实现销售订单抬头自定义字段,包括函数组子屏幕设计、数据存储表构建以及BADI方法的具体实现。这种增强方式适用于VA01/VA02/VA03等事务,保证了系统升级的兼容性和维护的便捷性

weixin_29758911的博客 349

结构型模式:享元模式(Flyweight Pattern)

一、设计模式的分类 (如果以前看过关于设计模式的分类的话,这部分可以忽略!) 经过很多大神的总结,目前Java中一共23种经典的设计模式! 按照目的,设计模式可以分为以下三种用途: 1.创建型模式:用来处理对象的创建过程 2.结构型模式:用来处理类或者对象的组合 3.行为型模式:用来对类或对象怎样交互和怎样分配职责进行描述 创建型模式用来处理对象的创建

未来,你好! 512

从Live2D到Unreal Engine:2D与3D虚拟数字人核心技术实现路径解析

本文深入解析了从Live2D到Unreal Engine的2D与3D虚拟数字人核心技术实现路径,涵盖技术选型、制作流程与优化技巧。通过对比2D骨骼动画与3D建模渲染的差异,结合实战案例,帮助开发者根据项目需求选择合适方案,提升虚拟数字人的交互体验与视觉效果。

weixin_30379531的博客 149

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

享元模式也叫蝇量模式,是运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。

知唔猪的博客 1644

【WRF安装】WRF编译错误:problems building executables look for error in the build log

WRF编译错误:problems building executables look for error in the build log

WW、forever的博客 752

【第1章>第5节】SOM自组织映射网络的理论学习与MATLAB仿真

自组织映射网络(Self-Organizing Map,SOM)是一种无监督学习的人工神经网络,由芬兰学者Teuvo Kohonen于1981年提出,也被称为Kohonen网络。它的主要功能是将高维输入数据映射到低维(通常是二维)的离散网格上,同时保持输入数据的拓扑结构,即相邻的输入数据在映射后的网格上也相邻。

FPGA/MATLAB学习教程/源码/项目合作开发 402

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

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

星Yeah 的博客 2111

RK3588上使用PCIE接口的国产千兆网卡YT6801

YT6801是裕太微电子开发的一款国产千兆PCIE以太网控制器芯片,可作为RK3588的PCIE外扩网口使用。

荻夜的博客 8212

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

定义: ​ 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。 存在两种状态: 内部状态,即不会随着环境的改变而改变的可共享部分。 外部状态,指随环境改变而改变的不可以共享的部分。享元模式的实现要领就是区分应用中的这两种状态,并将外部状态外部化。 主要角色: 抽象享元角色(Flyweight):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(

weixin_49107940的博客 160

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

从上面代码你可以发现,由于享元模式的复杂,实际应用也不是很多,这是我们更加无法看清他的真面目了。不过享元模式并不是鸡肋,它的精髓是共享,是对我们系统优化非常有好处的,而且这种思想已经别越来越多的应用,这应该就算是享元模式的应用了吧。

2401_84123077的博客 897

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

结构型模式:⑥享元模式(Flyweight Pattern)

1.单一职责原则:享元负责存储内部状态和处理核心逻辑,工厂负责缓存和创建,职责清晰;2.开闭原则:新增享元类型时,仅需新增具体享元类,工厂无需大幅修改;3.最小内存原则:通过共享内部状态,将对象数量从 “N 个” 减少到 “M 个”(M 为内部状态的种类数)。

ada0_ada1的博客 765

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

结构型模式--享元模式【Flyweight Pattern】

定义 运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。 优缺点 享元模式的主要优点是: 相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。 其主要缺点是: 为了使对象可以共享,需要将一...

thebigdipperbdx的博客 264

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

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

茶色喵的博客 403

【设计模式】结构型模式—享元模式(Flyweight Pattern)(十二)

**享元模式(Flyweight Pattern)是 "资源池技术"实现方式,主要用于`减少创建对象的数量`** - **模式动机**:在创建大量对象时,有可能会造成内存溢出,享元模式把其中共同的部分抽象出来,保存在内存中,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。 - 解决思路:复用对象最简单的方式是,用一个 HashMap 来存放每次新生成的对象。每次需要一个对象的时候,先到 HashMap 中看看有没有,如果没有,再生成新的对象,然后将这个对象放入 HashMap 中

墩墩分墩 599

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

运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。

babstyt的博客 913

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

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

JINGWHALE 1557

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

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

一路向前 404

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

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

lyfGeek的博客 220

【设计模式】【结构型模式(Structural Patterns)】之享元模式(Flyweight Pattern)

享元模式是一种用于性能优化的设计模式,通过共享尽可能多的对象来有效支持大量细粒度的对象。这种模式特别适用于那些对象数量巨大且大部分状态可以外部化的情况。

ido1ok的博客 1005

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

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

WU4566285的博客 496

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

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用,特别适用于存在大量相似对象的场景。该模式的核心思想是将对象的 内部状态(可共享部分)与 外部状态(不可共享部分)分离,通过共享内部状态来减少对象数量。

weixin_43510208的博客 354
上一篇: 行为型模式之责任链模式(Chain of Responsibility)
下一篇: 结构型模式之组合模式(Composite)
conquer0715
博客等级 码龄18年 73粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值