Kotlin设计模式:享元模式(Flyweight Pattern)

Kotlin设计模式:享元模式(Flyweight Pattern)

在移动应用开发中,内存和CPU资源是非常宝贵的。享元模式(Flyweight Pattern)是一种设计模式,旨在通过对象重用来优化内存使用和性能。本文将深入探讨享元模式的应用,并通过Kotlin代码示例展示其实现方式。

享元模式的目的

享元模式的主要目的是平衡应用程序中的内存使用。该模式强调对象的重用,而不是每次都创建新的对象。这意味着,通过享元模式,你可以节省对象创建时的CPU和内存开销,同时加快垃圾回收的速度。

享元模式有两种实现方式:

  1. 控制对象池中的对象移除:需要小心处理,以防止移除正在使用的对象。
  2. 为未使用的对象分配内存:不删除对象池中的对象,这意味着需要为当前未使用的对象分配内存。

这两种方法各有利弊,应根据具体需求选择合适的实现方式。

示例场景

假设你的应用在同一个屏幕的多个地方使用相同的图片。如果每次都创建新对象,你的应用可能会因OutOfMemoryError崩溃。通过使用享元模式,可以显著减少内存占用。例如,有3张大小为5MB的图片,通常总共需要15MB内存,但使用享元模式后,只需要5MB内存。

Kotlin中的享元模式实现

在享元模式中,我们通常使用一个工厂类(Factory)来创建对象。应用程序依赖于ImageImageFactory,通过ImageFactory创建Image对象。

代码示例

首先,定义一个Image数据类和一个ImageFactory工厂类:

data class Image(val bytes: ByteArray)class ImageFactory {private val cache = mutableMapOf<String, Image>()private suspend fun getImage(url: String): Image =cache[url] ?: fetchImage(url).also { image -> cache[url] = image }
}

使用享元模式

以下是如何在应用中使用上述工厂类的示例:

fun main() {val factory = ImageFactory()val scope = CoroutineScope(Dispatchers.IO)scope.launch {val image = factory.get("image")}scope.launch {val image = factory.get("image")}
}

在这个示例中,有一个同步问题:在第一个fetchImage(url)结束之前,另一个协程也尝试从缓存中获取相同URL的图片,由于缓存中尚未存在该图片,因此也调用了fetchImage(url)

使用Mutex解决同步问题

我们可以使用Mutex来解决这个问题,它的工作原理与享元模式类似:

class ImageFactory {private val cache = mutableMapOf<String, Image>()private val locks = mutableMapOf<String, Mutex>()private val lock = Mutex()suspend fun get(url: String): Image {val imageMutex = lock.withLock {locks.getOrPut(url) { Mutex() }}val image = imageMutex.withLock {getImage(url)}locks.remove(url)return image}private suspend fun getImage(url: String): Image =cache[url] ?: fetchImage(url).also { image -> cache[url] = image }
}

在这个实现中,我们使用了一个全局的Mutex来管理每个URL对应的Mutex。通过这种方式,可以确保同一时间只有一个协程在获取和缓存相同的图片。

结论

享元模式是一种强大的设计模式,适用于需要频繁创建相似对象的场景。通过重用对象,可以显著减少内存和CPU开销。本文展示了如何在Kotlin中实现享元模式,并通过实际示例演示了其应用。希望这些内容能帮助你在实际开发中更高效地管理资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/34307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker不要乱改工作路径,可能啥都会丢

买的国内某云服务器&#xff0c;系统盘比较小&#xff0c;数据盘稍微大点&#xff0c;啥都安装好了才发现docker实例存在了系统盘里面&#xff0c;寻思挪一下吧&#xff0c;好家伙&#xff0c;挪完了啥都丢了&#xff0c;我是这样移动的。 1.先把docker停了 sudo systemctl …

2023年零信任落地关键词:整合、身份、普及

2023年&#xff0c;全球企业纷纷加快了落地零信任的步伐。虽然落地的功能、落地的场景不尽相同&#xff0c;但企业对零信任的诉求、落地零信任的优先级却殊途同归&#xff0c;不同的零信任产品的应用场景也日益明晰。 全面整合和协同运行&#xff0c;是2023年企业用户对零信任…

一文搞懂Linux多线程【上】

目录 &#x1f6a9;引言 &#x1f6a9;再次理解页表 &#x1f6a9;初识线程 &#x1f6a9;线程和pthread库 &#x1f680;线程创建 &#x1f6a9;线程的资源共享问题 &#x1f6a9;线程的优缺点 &#x1f6a9;引言 今天&#xff0c;我们开始学习Linux中的线程部分。Lin…

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型&#xff08;LLMs&#xff09;&#xff0c;基本上是经过强化训练的 n-gram 模型&#xff0c;它们在网络规模的语言语料库&#xff08;实际上&#xff0c;可以说是我们文明的知识库&#xff09;上进行了训练&#xff0c;展现出了一种超乎预期的语言行为&#xff0c;引…

awk练习

作业&#xff1a;监控内存&#xff0c;cpu和硬盘的根目录&#xff0c;超过80%提示用户&#xff0c;写成函数库的行&#xff0c;每天早上 的8.50分&#xff0c;执行一次脚本。 [roottest3 opt]# vim zuoye.sh #函数库yingpan () {YP$(df -h | awk NR2{print $5})if [[ $YP &…

在Ubuntu服务器上安装配置和优化Zerotier:一步步指南

嗨&#xff0c;大家好&#xff01;今天我要在Ubuntu上部署和测试Zerotier。使用的是阿贝云的免费云服务器&#xff0c;这台免费云服务器真不错&#xff0c;1核CPU、1G内存、10G硬盘和5M带宽的配置&#xff0c;让我们在测试和开发中游刃有余。对一个奶爸黑客来说&#xff0c;阿贝…

Lodash-js工具库

1. Lodash 简介 Lodash 是一个现代 实用工具库&#xff0c;提供了许多有用的函数&#xff0c;帮助开发者处理常见的编程任务&#xff0c;如数组操作、对象处理、字符串处理等。Lodash 使得代码更简洁、更高效&#xff0c;极大地提高了开发效率。Lodash 的设计灵感来自于 Under…

react学习——09react中props属性

1、基本使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 移动端适配--><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>1_props基…

行业原型:智能资产管理平台-个人资产服务

​行业原型预览链接&#xff1a;&#xff08;请与班主任联系获取原型文档&#xff09; 文件类型&#xff1a;.rp 支持版本&#xff1a;Axrure RP 8 文档名称&#xff1a;金融&#xff1a;智能资产管理平台&#xff08;个人资产服务&#xff09; 文件大小&#xff1a;1.75 MB 智…

光伏发电项目是如何提高开发效率的?

随着全球对可再生能源需求的持续增长&#xff0c;光伏发电项目的高效开发成为关键。本文将深入探讨如何在实际操作中提高光伏发电项目的开发效率。 一、优化选址流程 1、数据收集与分析&#xff1a;利用卫星地图和遥感技术&#xff0c;收集目标区域的光照资源、地形地貌、阴影…

chrome 使用本地替换功能替换接口返回内容

前言 在web开发或测试过程中&#xff0c;我们经常会需要修改接口返回值来模拟数据进行开发或测试。 常用的方式一般通过抓包工具&#xff0c;如charles&#xff0c;或fildder 的功能。 例如我们可以使用charles打断点的方式&#xff0c;或者使用charles的map local 功能进行…

手工微调embedding模型,让RAG应用检索能力更强

BAAI/bge-small-en 目前HuggingFace的MTEB(海量文本Embedding基准)排行榜上排名第一的Embedding模型是big-large-en&#xff0c;它由北京人工智能研究院(BAAI&#xff0c;智源)开发。它是一种预训练的transformer模型&#xff0c;可用于各种自然语言处理任务&#xff0c;如文本…

VLLM部署通义千问

vllm 通过不同的chat_template推理部署常见qwen、chatglm、llama3等开源大模型 vllm官网地址&#xff1a;Installation — vLLM vllm 版本 4.0.0 镜像 vllm github 官方镜像 gpu v100 32g a800 80g openai api 方式 出现的问题通过 chat-template 聊天模板解决 1 推理部署qw…

艺术家电gorenje x 设计上海丨用设计诠释“生活的艺术”

2024年6月19日—22日&#xff0c;艺术家电gorenje亮相“设计上海”2024&#xff0c;以“gorenje是家电更是艺术品”为题&#xff0c;为人们带来融入日常的艺术之美。设计上海2024不但汇集了国内外卓越设计品牌和杰出独立设计师的家具设计作品&#xff0c;还联合国内外多名设计师…

ESP-01S 模块使用串口助手获取天气参数

ESP-01S 模块 接线AT命令ESP01S联网测试并获取心知天气测试流程 接线 引脚接线3V3接电源RST外部复位引脚&#xff0c;低电平复位。可以悬空或者接高电平。EN接高电平&#xff0c;高电平使能。TX接CH340的RXRX接CH340的TXIO0悬空&#xff1a;Flash Boot&#xff0c;工作模式。下…

素数筛(算法篇)

算法之素数筛 素数筛 引言&#xff1a; 素数(质数)&#xff1a;除了1和自己本身之外&#xff0c;没有任何因子的数叫做素数(质数) 朴素筛法(优化版) 概念&#xff1a; 朴素筛法&#xff1a;是直接暴力枚举2到当前判断的数x(不包括)&#xff0c;然后看在这范围内是否存在因…

用c 代码来研究 dft(discrete fourier transform)

/// // author: hjjdebug // date : 2024年 06月 24日 星期一 15:59:53 CST // descpripton: // 用c 代码来研究 dft(discrete fourier transform) /// 文章目录 甲: DFT 的定义&#xff1a;乙: 下面给出用c代码实现的dft 公式&#xff0c; 验证了手工计算的正确性.丙&#xff…

智慧在线医疗在线诊疗APP患者端+医生端音视频诊疗并开处方

智慧在线医疗&#xff1a;音视频诊疗新纪元 &#x1f310; 智慧医疗新篇章 随着科技的飞速发展&#xff0c;智慧医疗正逐步走进我们的生活。特别是在线医疗&#xff0c;凭借其便捷、高效的特点&#xff0c;已成为许多患者的首选。而其中的“智慧在线医疗患者端医生端音视频诊疗…

Jrebel热部署

1、下载包 2、解压后本地启动exe文件 3、配置 http://127.0.0.1:8888/{GUID} https://www.guidgen.com/ 获取 GUID 4、激活后&#xff0c;Jrebel针对本项目模块进行勾选 5、如果报错&#xff0c;setting设置offine

代码随想录训练营Day 69|并查集理论基础、卡码网107.寻找存在的路径

1.并查集理论基础 并查集理论基础 | 代码随想录 并查集可以解决什么问题呢&#xff1f; 主要就是集合问题&#xff0c;两个节点在不在一个集合&#xff0c;也可以将两个节点添加到一个集合中。 注意&#xff1a;求根是求箭头出发的数 路径压缩&#xff1a;求根的根。把根的根的…