Android设计模式详解之享元模式
创始人
2024-05-03 05:42:14
0

前言

享元模式是对象池的一种实现,用来尽可能减少内存使用量,适合用于可能存在大量重复对象的场景,来缓存可共享的对象;

定义:使用共享对象可有效地支持大量的细粒度的对象;

使用场景:

  • 系统中存在大量的相似对象;
  • 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份;
  • 需要缓冲池的场景;

UML类图:
享元模式UML
Flyweight:享元对象抽象基类或者接口;

ConcreteFlyweight:具体的享元对象;

FlyweightFactory:享元工厂,负责管理享元对象池和创建享元对象;

示例代码

这里以读书进行举例,现在想阅读三国演义,但家里没有那就需要去买一本(享元工厂生产一本三国),读完了又想看水浒传,家里也没有那也需要去买一本(享元工厂生产一本水浒),回过头,又想要在读一遍三国,那就不再在去买了,直接找到原来的一本读就好了;

下面用享元模式实现:

  • 定义抽象享元类,Book
/*** 享元对象抽象基类*/
interface Book {/*** readBook*/fun readBook()
}
  • 定义具体享元对象,ConcreteBook
/*** 具体的书籍,具体的享元对象* @param name 图书名称*/
class ConcreteBook(private val name: String) : Book {override fun readBook() {println("当前正在阅读:$name")}
}
  • 定义享元工厂,BookFactory
/*** 图书工厂*/
object BookFactory {private val bookMaps = hashMapOf()fun getBook(name: String): ConcreteBook {return if (bookMaps.containsKey(name)) {println("家里有该书籍,直接找到")bookMaps[name] as ConcreteBook} else {println("家里没有该书籍,去买一本")val book = ConcreteBook(name)bookMaps[name] = bookbook}}
}
  • 编写调用类,验证功能
object Test {@JvmStaticfun main(args: Array) {//阅读三国演义val book1 = BookFactory.getBook("三国演义")book1.readBook()println("============================")//阅读水浒传val book2 = BookFactory.getBook("水浒传")book2.readBook()println("============================")//再读一遍三国演义val book3 = BookFactory.getBook("三国演义")book3.readBook()}
}

输出结果如下:

家里没有该书籍,去买一本
当前正在阅读:三国演义
============================
家里没有该书籍,去买一本
当前正在阅读:水浒传
============================
家里有该书籍,直接找到
当前正在阅读:三国演义

Android源码中的享元模式

  • Message,熟悉Android消息机制的同学,对于Message肯定不陌生,我们废话不多说,直接看源码:
public final class Message implements Parcelable {//message相关信息public int what;public int arg1;public int arg2;public Object obj;public Messenger replyTo;//可以看出message是一个链表结构Message next;public static final Object sPoolSync = new Object();private static Message sPool;//当前消息池的大小private static int sPoolSize = 0;//消息池中最多缓存50个messageprivate static final int MAX_POOL_SIZE = 50;private static boolean gCheckRecycle = true;//如果sPool不为null,则从消息池中取消息,否则直接new Message()对象;public static Message obtain() {synchronized (sPoolSync) {if (sPool != null) {//从链表头取出MessageMessage m = sPool;sPool = m.next;m.next = null;m.flags = 0; // clear in-use flagsPoolSize--;return m;}}return new Message();}//进行回收public void recycle() {//如果当前正在使用,则调用recycle方法抛异常if (isInUse()) {if (gCheckRecycle) {throw new IllegalStateException("This message cannot be recycled because it "+ "is still in use.");}return;}recycleUnchecked();}//回收处理,清除相关信息,并将message插入到消息池中void recycleUnchecked() {flags = FLAG_IN_USE;what = 0;arg1 = 0;arg2 = 0;obj = null;replyTo = null;sendingUid = UID_NONE;workSourceUid = UID_NONE;when = 0;target = null;callback = null;data = null;synchronized (sPoolSync) {//判断消息池不满50时,将消息插入到链表头部if (sPoolSize < MAX_POOL_SIZE) {next = sPool;sPool = this;sPoolSize++;}}}}

从上面我们可以看出,调用Message.obtain()方法会从消息缓存池中取消息,这也是为什么推荐大家使用Message.obtain()方法而不是直接new Message()的原因,当Message被回收的时候,会清除相关信息,将消息存放到消息池中,从而实现消息的重复利用,典型的享元模式!!!

总结

优点:

  • 大幅度地降低内存中对象的数量,降低程序内存占用;

缺点:

  • 使得系统更加复杂,为了使对象可以共享,需要将一些状态外部化,使得程序的逻辑复杂化;
  • 将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长;

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

相关内容

热门资讯

安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...