首页 > 其他分享 >Android设计模式之单例模式

Android设计模式之单例模式

时间:2023-04-06 10:11:35浏览次数:50  
标签:单例 方式 饿汉 Android 设计模式 懒汉 加载


之前的一篇文章「Android开发如何进阶?」提到设计模式可谓是进阶必备,对设计模式的理解与运用对你之后的代码书写与架构设计有很多的帮助作用,那么从今天开始我就抽时间不定期来给大家分享下设计模式系列。

什么是设计模式?其实简单的理解就是前人留下来的一些经验总结而已,然后把这些经验起了个名字叫Design Pattern,翻译过来就是设计模式的意思,通过使用设计模式可以让我们的代码复用性更高,可维护性更高,让你的代码写的更优雅。设计模式理论上有23种,但是我只会针对Android平台上常用的一些设计模式做分享,今天就先来分享下最常用的单例模式。

饿汉式


Android设计模式之单例模式_单例模式

「饿汉式」是最简单的实现方式,这种实现方式适合那些在初始化时就要用到单例的情况,这种方式简单粗暴,如果单例对象初始化非常快,而且占用内存非常小的时候这种方式是比较合适的,可以直接在应用启动时加载并初始化。


但是,如果单例初始化的操作耗时比较长而应用对于启动速度又有要求,或者单例的占用内存比较大,再或者单例只是在某个特定场景的情况下才会被使用,而一般情况下是不会使用时,使用「饿汉式」的单例模式就是不合适的,这时候就需要用到「懒汉式」的方式去按需延迟加载单例。

懒汉式


Android设计模式之单例模式_设计模式_02

「懒汉式」与「饿汉式」的最大区别就是将单例的初始化操作,延迟到需要的时候才进行,这样做在某些场合中有很大用处。比如某个单例用的次数不是很多,但是这个单例提供的功能又非常复杂,而且加载和初始化要消耗大量的资源,这个时候使用「懒汉式」就是非常不错的选择。

多线程下的单例模式

上面介绍了一些单例模式的基本应用方法,但是上面所说的那些使用方式都是有一个隐含的前提,那就是他们都是应用在单线程条件下,一旦换成了多线程就有出错的风险。

如果在多线程的情况下,「饿汉式」不会出现问题,因为JVM只会加载一次单例类,但是「懒汉式」可能就会出现重复创建单例对象的问题。为什么会有这样的问题呢?因为「懒汉式」在创建单例时是 线程不安全的,多个线程可能会并发调用他的 newInstance 方法导致多个线程可能会创建多份相同的单例出来。

那有没有办法,使「懒汉式」的单利模式也是线程安全的呢?答案肯定是有的,就是使用加同步锁的方式去实现。

懒汉式同步锁

Android设计模式之单例模式_设计模式_03

这种是最常见的解决同步问题的一种方式,使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成instance被多次实例化。举个在Android使用这种方式的例子:

InputMethodManager示例

Android设计模式之单例模式_初始化_04

以上是Android源码中输入法类相关的单例使用方式。

但其实还有一种更好的方式如下:

双重校验锁

Android设计模式之单例模式_单例模式_05

可以看到上面在 synchronized (Singleton.class) 外又添加了一层if,这是为了在instance已经实例化后下次进入不必执行 synchronized (Singleton.class) 获取对象锁,从而提高性能。

以上两种方式还是挺麻烦的,我们不禁要问,有没有更好的实现方式呢?答案是肯定的。 我们可以利用JVM的类加载机制去实现。在很多情况下JVM已经为我们提供了同步控制,比如:

  • 在static{}区块中初始化的数据
  • 访问final字段时
  • 等等

因为在JVM进行类加载的时候他会保证数据是同步的,我们可以这样实现:

采用内部类,在这个内部类里面去创建对象实例。这样的话,只要应用中不使用内部类 JVM 就不会去加载这个单例类,也就不会创建单例对象,从而实现「懒汉式」的延迟加载和线程安全。

实现代码如下:

静态内部类

Android设计模式之单例模式_设计模式_06

这样实现出来的单例类就是线程安全的,而且使用起来很简洁,麻麻再也不用担心我的单例不是单例了。

然而这还不是最简单的方式,「Effective Java」中推荐了一种更简洁方便的使用方式,就是使用枚举。

枚举类型单例模式

Android设计模式之单例模式_设计模式_07

使用方法如下:

Android设计模式之单例模式_设计模式_08

总结

一般单例模式包含了5种写法,分别是饿汉、懒汉、双重校验锁、静态内部类和枚举。相信看完之后你对单例模式有了充分的理解了,根据不同的场景选择最你最喜欢的一种单例模式吧!

感谢

本文大量参考了我一位同事的文章,并在此进行了补充与总结,感谢。




标签:单例,方式,饿汉,Android,设计模式,懒汉,加载
From: https://blog.51cto.com/stormzhang/6172267

相关文章

  • 推荐一个很好用的 Android Studio 插件
    事情是这样的,今天一位小伙伴发布了一条微博,然后@了我,内容是发布了一款AS的插件,我看了下,确实很好用,于是果断微博帮忙转发了,但是我觉得还不够,这个小插件非常实用,就想着公众号也扩散下,让更多的小伙伴可以受益。这个AS插件叫做 Android-Resource-Usage-Count,顾名思义,这是一个可......
  • 前端设计模式——MVC模式
    MVC模式(Model-View-Controller):是一种前端和后端都广泛应用的设计模式。它将应用程序的业务逻辑、数据表示和用户界面分离,使得开发人员可以独立地修改各部分而不影响其他部分。MVC设计模式有助于提高代码的可读性、可维护性和可重用性。MVC是Model-View-Controller的缩写,它将一个......
  • uni-app:ios/android中的nvue和vue页面加载自定义字体(hbuilderx 3.7.3)
    一,官方文档地址:https://uniapp.dcloud.net.cn/tutorial/nvue-api.html#addrule二,代码1,nvue页面:模板<viewclass="listTitle">{{item.title}}</view>......
  • 设计模式之————依赖注入(Dependency Injection)与控制反转(Inversion of Controll
     参考链接:依赖注入(DI)or控制反转(IoC)laravel学习笔记——神奇的服务容器PHP依赖注入,从此不再考虑加载顺序名词解释IoC(Inversion of Controller) 控制反转(概念)DI(Dependency Inject) 依赖注入(IoC概念中的一种类型实现)通过依赖声明自动实例化依赖的类(通常通过反......
  • 设计模式(三十二)----综合应用-自定义Spring框架-自定义Spring IOC-自定义Spring IOC
    1自定义SpringIOC总结1.1使用到的设计模式工厂模式。这个使用工厂模式+配置文件的方式。单例模式。SpringIOC管理的bean对象都是单例的,此处的单例不是通过构造器进行单例的控制的,而是spring框架对每一个bean只创建了一个对象。模板方法模式。AbstractApplicationC......
  • Android之一个简单计算器源代码
    通过Android4.0 网格布局GridLayout来实现一个简单的计算器界面布局 源码如下(欢迎大家指导批评) packagecom.android.xiong.gridlayoutTest;importjava.math.BigDecimal;importjava.util.regex.Pattern;importcom.android.xiong.gridlayoutTest.R.id;......
  • Android MVP 实例
    本文是「吴小龙同学」投稿,MVP其实一直被提及比较多,我的读者们可能有一些人不理解,其实再多的理论比不上一次简单的实践,这篇文章就以一个简单的请求天气功能,来演示AndroidMVP是如何使用的。效果预览准备MVP流程说明:步骤1:UI实现View方法,引用Presenter步骤2:Presenter调用Model,走Model......
  • Android性能优化总结
    这是来自一位粉丝「MeloDev」的投稿,讲真,我这里投稿的不少,但是只有我自己觉得很不错的才会通过,这篇文章我觉得对大家有用,而且性能优化也算是我面试必问的一个话题了,所以这里推荐给大家。微信不支持链接,可点击「阅读原文」查看原文。写在前面公司给了我一周的时间去学习Android性能的......
  • Android开发如何进阶?
    本着每周至少有干货产出的原则,今天必须写篇干货来回馈大家,我这的干货可是不收费的哦,争取以后的目标是让你们看完我的文章不赞赏都觉得亏得慌!之前不少人都问我同一个问题,就是我学习Android有一两年了,但是遇到瓶颈了,感觉没什么进步,到底怎么才能进阶呢?我相信有不少人遇到这样的困扰,那......
  • Android 还可以走多久?
    阅读文本大概需要1.8分钟。最近,有位知识星球的球友问我这么一个问题:「张哥,我做Android开发两年多时间了,但是最近总是很焦虑,看着人工智能越来越火,很担心Android要不行了,想问下,我现在要转行么?Android还可以走多久?」这个问题我觉得还蛮有代表性的,今天就姑且给大家谈谈这个话题......