安卓常见设计模式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 问题 海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...

高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...