安卓常见设计模式8------享元模式(Kotlin版)
1. W1 是什么,什么是享元模式?
- 享元模式(Flyweight Pattern)是一种结构型设计模式,用于有效地支持大量细粒度的对象共享。
- 在 Android 中,享元模式可以用于减少内存使用和提高性能,特别是在需要创建大量相似对象的情况下。
2. W2 为什么,为什么需要使用享元模式,能给我们编码带来什么好处?
-
资源利用率提高:享元模式可以实现对象的共享,减少了系统中相同对象的数量,从而降低了内存的占用。通过共享对象,可以提高系统的资源利用率,特别是在需要创建大量相似对象的情况下。
-
性能提升:由于享元模式减少了对象的数量,减少了对象的创建和销毁开销,从而提高了系统的性能。通过共享对象,可以避免重复创建相同的对象,减少了系统中频繁的对象创建和销毁操作,提高了系统的响应速度和效率。
-
内存占用减少:通过共享相同的对象,享元模式可以减少内存的占用。相同的对象只需保存一份,而不是为每个对象都保存一份数据,从而降低了内存的使用量。这对于需要创建大量对象的应用程序来说尤为重要。
-
状态外部化:享元模式将对象的状态外部化,使得对象可以共享状态。这样可以简化对象的内部状态,使对象更加轻量级。状态的外部化也使得对象的状态可以在多个对象之间共享和传递,提供了更大的灵活性和可扩展性。
解释:当我们使用享元模式时,可以将对象的一部分状态(称为内部状态)从对象内部移到对象外部,这就是状态外部化。这样做的目的是让多个对象可以共享相同的状态,从而节省内存并提高性能。
想象一下,你正在玩一个多人游戏,每个玩家都有一个角色对象。这些角色对象可能有一些共同的属性,比如血量、等级等。使用享元模式,我们可以将这些共同的属性作为内部状态,并将其存储在一个共享的对象中。
这意味着每个角色对象只需要存储自己的特有属性(称为外部状态),比如位置、装备等。而那些共同的属性,比如血量和等级,可以由共享对象管理和维护。
通过共享内部状态,我们可以大大减少内存消耗,因为相同的属性只需要在内存中存储一份。此外,当需要修改共享属性时,只需修改共享对象的状态,而不需要修改每个角色对象的状态。
这种方式还提供了灵活性和可扩展性。如果新的角色加入游戏,它们可以共享现有的属性,而无需创建新的对象。同时,如果需要改变共享属性的行为,只需修改共享对象即可,这将自动影响到所有共享该属性的角色对象。
- 可维护性提高:通过使用享元模式,可以明确区分内部状态和外部状态,使得代码结构更加清晰和易于理解。共享对象的管理集中化,使得代码更加易于维护和扩展。
4. W3,如何使用?下面是代码示例:
// 在一个文字处理app中,用户可以选择不同的字体来设置文本样式。然而,创建和管理大量字体对象可能会导致内存消耗过高。这时可以使用享元模式来共享和复用已经创建的字体对象,从而减少内存占用。
首先,我们定义享元对象接口 Font,它表示字体对象:
interface Font {fun apply(text: String): String
}
然后,我们创建具体的享元对象实现,例如 ArialFont 和 TimesNewRomanFont:
class ArialFont : Font {override fun apply(text: String): String {return "<span style=\"font-family: Arial;\">$text</span>"}
}class TimesNewRomanFont : Font {override fun apply(text: String): String {return "<span style=\"font-family: Times New Roman;\">$text</span>"}
}
在这个例子中,我们假设字体对象的 apply 方法会将给定的文本应用相应的字体样式,并返回带有 HTML 标记的文本。
接下来,我们创建享元工厂类 FontFactory,用于创建和管理字体对象:
object FontFactory {private val fonts: MutableMap<String, Font> = HashMap()fun getFont(fontName: String): Font {return fonts.getOrPut(fontName) {when (fontName) {"Arial" -> ArialFont()"Times New Roman" -> TimesNewRomanFont()else -> throw IllegalArgumentException("Unsupported font: $fontName")}}}
}
在这个例子中,我们使用一个 MutableMap 来存储已经创建的字体对象,并根据字体名称进行查找和创建。
最后,我们可以在文字处理应用中使用享元模式来管理字体对象的创建和使用:
// 在文字处理应用中的某个类中
fun applyFontToText(text: String, fontName: String) {val font = FontFactory.getFont(fontName)val formattedText = font.apply(text)// 应用带有字体样式的文本到界面上// ...
}
通过使用享元模式,我们可以避免重复创建相同字体的对象,而是共享和复用已经创建的字体对象,从而减少了内存占用。
Thank you for your reading, best regards!
相关文章:
安卓常见设计模式8------享元模式(Kotlin版)
1. W1 是什么,什么是享元模式? 享元模式(Flyweight Pattern)是一种结构型设计模式,用于有效地支持大量细粒度的对象共享。在 Android 中,享元模式可以用于减少内存使用和提高性能,特别是在需…...
day54 django中orm数据库增删改查
昨日内容回顾 三板斧问题 HttpResponse # 返回的是字符串 render # 渲染一个HTML静态文件,模板文件 redirect # 重定向的 """在视图文件中得视图函数必须要接收一个形参request,并且,视图…...
【js逆向实战】某sakura动漫视频逆向
写在前面 再写一个逆向实战,后面写点爬虫程序来实现一下。 网站简介与逆向目标 经典的一个视频网站,大多数视频网站走的是M3U8协议,就是一个分段传输,其实这里就有两个分支。 通过传统的m3u8协议,我们可以直接进行分…...
L2-015 互评成绩
学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。 输入格式…...
【Docker安装RockeMQ:基于Windows宿主机,并重点解决docker rocketMQ安装情况下控制台无法访问的问题】
拉取镜像 docker pull rocketmqinc/rocketmq创建网络 docker network create rocketmq-net构建namesrv容器 docker run -d -p 9876:9876 -v D:/dockerFile/rocketmq/namesrv/logs:/root/logs -v D:/dockerFile/rocketmq/namesrv/store:/root/store --network rocketmq-net -…...
Android Studio——android项目运行main()函数
报错: 解决: 如图,在 .idea 的 gradle.xml 中标注的位置增加如下一行代码即可<option name"delegatedBuild" value"false" />...
移动医疗科技:开发互联网医院系统源码
在这个数字化时代,互联网医院系统成为了提供便捷、高效医疗服务的重要手段。本文将介绍利用移动医疗科技开发互联网医院系统的源码,为医疗行业的数字化转型提供有力支持。 智慧医疗、互联网医院这一类平台可以通过线上的形式进行部分医疗服务ÿ…...
代码审计, 介绍, 思路总结
代码审计 一, 代码审计介绍 渗透测试中的代码审计是一个关键步骤,它涉及到深入检查应用程序的源代码,以发现安全漏洞、弱点或不合规的编码实践。这种审计通常由专业的安全工程师或渗透测试人员执行,并侧重于识别可能被黑客利用的安全缺陷。…...
2023NOIP A层联测27 总结
T1 一棵树,操作是把一个点染黑,查询点 x x x 到黑点路径上的最小编号, n ≤ 1 0 6 n\le10^6 n≤106。当时的思路是把树分成几部分,中间和周围的散块,发现不会,就没思路了,就去打了25pts暴力。赛…...
2022最新版-李宏毅机器学习深度学习课程-P34 自注意力机制类别总结
在课程的transformer视频中,李老师详细介绍了部分self-attention内容,但是self-attention其实还有各种各样的变化形式: 一、Self-attention运算存在的问题 在self-attention中,假设输入序列(query)长度是N…...
css sprite 的优缺点,使用方法和示例
CSS Sprite是一种网页图片应用处理方式。 CSS Sprite的原理是将一个网页或者一个模块所用到的零碎的icon整合拼接到一张大图里,再把这张大图作为背景图放入到网页中,当访问该页面时,加载的图片就不会像以前那样一幅一幅地慢慢显示出来了。 …...
通过Cookie和Session来实现网站中登录账号的功能
文章目录 一、Cookie和Session二、基于Cookie和Session实现登录账号的功能2.1步骤一2.2步骤二2.3步骤三2.4总结通过Cookie和Session来实现登录功能2.5运行截图 一、Cookie和Session cookie是http请求header中的一个属性,是浏览器持久化存储数据的一种机制ÿ…...
QWidget 实现九宫格图案解锁
前言 最近需要实现一个九宫格图案解锁功能,查看网上的方案,基于QWidget的方案全网搜来搜去就一篇 Qt编写自定义控件:图案密码锁, 都是炒来炒去的同一篇,代码还比较复杂,运行后在PC端还是可以的,但是运行在arm机器上,就卡顿,或者容易断开手势连接线,各种不友好,于是自…...
设计模式-适配器模式(Adapter)
设计模式-适配器模式(Adapter) 一、适配器模式概述1.1 什么是适配器模式1.2 简单实现适配器模式1.3 使用适配器模式注意事项 二、适配器模式的用途三、实现适配器模式的方式3.1 继承适配器模式(Inheritance Adapter)3.2 组合适配器…...
react:创建项目
一: 使用create-react-app // 默认创建reactjs的webpack打包项目 npm i create-react-app -g create-react-app 项目名// 创建ts项目打包项目 sudo npx create-react-app my-app --template typescript 二: 使用vite npm create vitelatest // 创建react…...
RabbitMQ集群
RabbitMQ概述 1.RabbiMQ简介 RabbiMQ是⽤Erang开发的,集群⾮常⽅便,因为Erlang天⽣就是⼀⻔分布式语⾔,但其本身并不⽀持负载均衡。支持高并发,支持可扩展。支持AJAX,持久化,用于在分布式系统中存储转发消…...
Qt QtCreator调试Qt源码配置
目录 前言1、编译debug版Qt2、QtCreator配置3、调试测试4、总结 前言 本篇主要介绍了在麒麟V10系统下,如何编译debug版qt,并通过配置QtCreator实现调试Qt源码的目的。通过调试源码,我们可以对Qt框架的运行机制进一步深入了解,同时…...
JavaScript如何实现钟表效果,时分秒针指向当前时间,并显示当前年月日,及2024春节倒计时,源码奉上
本篇有运用jQuery,记得引入jQuery库,否则不会执行的喔~ <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> <meta name"chenc" content"Runoob"> <met…...
重生奇迹MU套装大全中的极品属性
在重生奇迹MU之中,你不能如其他游戏一般只看攻击与防御,你更要看属性,这才是重生奇迹中的王道!属性好,才是极品,属性不佳,即便攻击、防御再出色,也只能沦落成为一件替用品࿰…...
用Python解决猴子分桃问题
1 问题 海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
