【Android】设计模式之单例模式

深度认识单例模式;在Android源码中的应用 前言 身为程序员,你可能没有系统的学习过设计模式,但是你一定知道单例模式,因为它相对简单,而且最常被大家所用到。既然大家都用到过,也都知道为什么我还要单独列出一篇文章来写呢? 因为绝大部分开发者平时对单例模式的认识,可能仅仅停留在“会用”的阶段。为什么会有这个模式?为什么要用这个模式?在哪里用单例模式最合适?乱用了会有什么负面影响? 这些可能大多数人都一知半解。今天就让我们大家一起来扒光单例... 阅读详情

00、前言

设计模式,不仅面试官爱问,而且在做一些架构上的设计,或者一些库的封装上,也是必不可少的要素。那么今天我们来捋一捋最常见,也最容易理解的设计模式——单例模式。

01、单例模式

基础写法

想起,当年为了应付面试。便把下面的单例模式的写法强行记忆了下来。

public class Singleton(){
    private static Singleton instance;
    private static Singleton getInstance(){
        if(instance == null){
           instance = new Singleton;
        }
         return instance;
    }

简单分析一下上面的写法。首先定义一个静态变量,提供一个静态方法实例化,并将实例赋值给静态变量,最后将该实例作为该函数的返回值,就完事了。

逻辑上也很好理解,就是当调用 getInstance(),如果 instance 为空,则新建一个,否则返回实例。

但单例模式,远远不仅如此。还有很多情况与写法。

单例模式多种写法

首先,思考一下为什么要用单例模式。单例模式,就是设计者,希望这个类只被实例化一次,就可以提供给全局使用。
那么怎么才能保证【只被实例化一次】呢?那当然是把,构造器私有化, 这样别人就不能去实例化我们设计的类了。

但是,在实际项目中,还需要考虑多线程的问题。像上面那种写法,是无法保证线程安全的。上面那种模式,我们成为懒汉模式。为什么叫懒汉模式呢?也很好理解,因为懒嘛,所以就等到要用的时候,才进行实例化。

至于这种模式为什么不是线程安全的呢?那是因为当两个线程同时走到 if(instance == null) 的时候,条件都是成立的,这时候,第一个拿到的实例,和第二个拿到的实例就不是同一个实例了。这样违背了,我们设计单例的初衷。

懒汉-线程安全

那么可能有人会想到,在原本的基础上加上同步锁 synchronized 。于是就有了 懒汉-线程安全 的单例模式。

public class Singleton(){
    private static Singleton instance;
    private static synchronized Singleton getInstance(){
        if(instance == null){
           instance = new Singleton;
        }
         return instance;
    }
}

双重检查加锁

因为同步锁的加解锁操作会耗时,这样会降低效率。于是在上面的基础上出现了 双重检查加锁 的单例模式。

public class Singleton(){
    private static Singleton instance;
    private static Singleton getInstance(){
        if(instance==null){
           synchronized (Singleton.class){
               if(instance==null){
           instance = new Singleton;
           }
           }
        } 
         return instance;
    }
}

在加锁前,先进行判断,这样就避免不必要的加解锁操作,从而提供效率了~

饿汉模式

解决多线程,除了上面加锁的思路。还有一种思路就是在写单例模式的类的时候,就已经初始化好了,无需等用户调用的时候再初始化,也是一条思路。于是就有了饿汉模式。因为饿嘛,就是等不及了。先把“吃的”(实例)准备好先。

public class Singleton(){
    private static Singleton instance =  new Singleton()
    private static Singleton getInstance(){
        return instance;
    }
}

静态内部类单例模式

这种模式存在一个问题,就是在类被加载的时候,就要完成初始化。所以这会导致加载缓慢。为了解决这个问题-于是有了 静态内部类单例模式

public class Singleton(){
    private Singleton()
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
    private static class SingletonHolder{
        private static final Singleton instance = new Singleton();
    }
}

02、图总结

有点凌乱?没事,上图。

记住它们出现的原因,为了解决什么样的问题。就可以记住它们了。

03、kotlin 写法

接下来,就是看看 Kotlin 的写法了

懒汉模式

class Singleton private constructor(){
    companion object{
        private var instance:Singleton ?= null
            get(){
                if(field == null){
                    field = Singleton()
                }
                return field
            }
        fun get():Singleton{
                return instance!!
            }
    }
}

//private constructor() 主构造器私有化,并自定义属性访问器 fun get():Singleton

懒汉-线程安全模式

class Singleton private constructor() {
    companion object {
        private var instance: SingletonDemo? = null
            get() {
                if (field == null) {
                    field = Singleton()
                }
                return field
            }

        @Synchronized
        fun get(): SingletonDemo {
            return instance!!
        }
    }

// 在get()方法上添加了 @Synchronized 注解。

双重检查加锁模式

class Singleton private constructor() {
    companion object {
        val instance: Singleton by 
            lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            Singleton()
        }
    }
}

//lazy 是kotlin中的延迟属性

饿汉模式

object Singleton

静态内部类模式

class Singleton private constructor() {
    companion object {
        val instance = SingletonHolder.holder
    }

    private object SingletonHolder {
        val holder = Singleton ()
    }

}

作者:Quincy_Ye
链接:https://juejin.cn/post/7151584359110639653
更多Android学习笔记+视频资料可点击文末卡片获取!

【Android面试八股文】Android Application为什么是单例? 这道题相对简单,就是考察大家是否了解application的创建流程。的实例,它用来存储和处理整个全局变量的一些事情,它同时还是一个。为空的时候,才会创建,从而保证了它是一个单例对象。一样有自己的生命周期,但是它并没有那么复杂,因为。对象的创建过程,找出它为什么是单例的原因。全局进行一些配置,比如配置插件。的时候才会创建,所以说可以在。凭什么是单例,我们查看下。启动的时候都会创建一个。是怎么一步步创建的。是一个单例,即每一个。 阅读详情

相关推荐

Android源码设计模式探索与实战【单例模式】

IT行业,一直讲一句话,拼到最后都拼的是“内功”,而内功往往就是指我们处理问题的思路、经验、想法,而对于开发者来说,甚至对于产品也一样,都离不开一个“宝典”,就是设计模式。今天我们一起借助Android源码去探索一下单例模式的优缺点,以及它所想要去解决的问题。同时结合我工作经验中的一个小例子,来总结实践一下。 1.背景&定义 理解: 单例模式是创建性设计模式的一种。是我们最常见、也可能是开发者肯定会使用的一种设计模式。 先从单例这个词来理解,在应用这个设计模式的时候,单例对象必须保证全局只有一个.

itbird的专栏 815

【Android】之【Aplication】

Android Application相关技术知识点整理。

Crazy程序猿 3041

用Matlab搞定Delta并联机器人运动学:从建模到正逆解完整流程(附代码)

本文详细介绍了如何使用Matlab实现Delta并联机器人的运动学分析,包括几何建模、正逆解求解及可视化验证。通过符号计算和数值迭代法,解决非线性方程组问题,并提供完整代码示例,帮助读者快速掌握Delta机器人的运动学计算与应用。

weixin_30955617的博客 175

Android设计模式之单例模式

Android设计模式之单例模式

xiaokang666的博客 1389

python气象数据可视化学习笔记8——利用matplotlib和ERA5数据绘制时间-高度气象综合廓线图

利用matplotlib和ERA5数据绘制时间-高度气象综合廓线图

qiuylulu的博客 8063

单细胞实战之数据净化三部曲:细胞周期校正、双胞体剔除与RNA污染清理——技术解析与实战指南

本文深入解析单细胞数据分析中至关重要的数据净化步骤,即细胞周期校正、双胞体剔除与RNA污染清理。通过实战代码演示与原理剖析,指导读者如何有效识别并去除技术噪音,从而获得更纯净、可靠的数据,为后续的细胞分群、差异表达等高级分析奠定坚实基础。

weixin_29274337的博客 204

Android中的单例模式(java单例模式详解,Glide,EventBus,LayoutInfalter的源码单例模式详解)

名称优点缺点普通的单例模式实现简单,操作简单,理解简单多线程并发操作资源的时候不安全,会导致资源数据混乱饿汉模式线程安全内存资源的消耗会相对多一些懒汉模式线程安全需要上锁,线程资源需要同步排队等待执行,性能方面相对较低静态内部类模式线程安全、避免了对象的实例化操作,可通过外部类直接访问静态的内部类操作创建单一的实例对象。暂无。

weixin_46039528的博客 5502

2022(一等奖)B360基于Arcpy与SVM的滑坡易发性评价

此外,在ArcGIS平台下,“易发性图预测(多进程)”工具的运行时间为2h 48m 3s,“易发性图预测(单进程)”工具的运行时间为5h 19m 27s,运行时间缩短了近2h 31m 24s,运行效率提高了47.39%。在ArcGIS Pro平台下,“易发性图预测(多进程)”工具的运行时间为20m 12s,“易发性图预测(单进程)”工具的运行时间为1h 26m 47s,将运行时间缩短了近1h 6m 35s,运行效率提高了76.72%。滑坡的发生受各种影响因素的影响,目前,影响因素的选择没有一个统一的标准。

2301_77310370的博客 1465

Android设计模式之单例模式(Singleton Pattern)

Android设计模式之单例模式(Singleton Pattern) 个人总结学习和研究,部分内容参考《Android源码设计模式解析与实战》一书~~ 一. 定义: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 也就是说,单例要满足3点: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。(构造函数私有化,防止...

hk121的博客 264

PCL基础:getTransformation函数全流程解析与应用实例,一篇文章精通点云变换

在 Eigen 和 PCL 中,getTransformation是一个常用的函数,用于根据输入的平移和旋转信息(如欧拉角或四元数)生成一个仿射变换矩阵(Eigen::Affine3f或 Eigen::Affine3d)。1)在 Eigen 中,可以通过四元数和平移向量构造一个变换矩阵。2)讲解了从四元数转换到欧拉角,或者从欧拉角转换到四元数的方法。

weixin_42896234的博客 1368

MacBook Air老本重装系统

手里的这个本子型号是A1466,cpu i5,4G内存,硬盘ssd 120G。 重装系统可以在原系统上升级到更新版本,或者用U盘安装。 先确定,这个本子可以安装什么系统。 最权威的信息当然是apple的官网,地址:https://support.apple.com/zh-cn/HT211683 在“检查兼容性”中,可以依次检查每个系统兼容的硬件型号。Mojave是A1466能安装的最高版本。 确认兼容性后,下一步就是下载安装文件。还是这个页面稍下面一点可以找到。 这里告诉用户文件可以在什

bigwood99的博客 2万+

Android 设计模式入门到精通之一:单例模式(Singleton Pattern)

设计模式项目源码请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,代码设计模式&框架设计实现不妥之处,请帮忙指正),谢谢! 单例模式(Singleton Pattern) 一、概念及技术背景 Ensure a class has only one instance, and pro...

caobaokang的专栏 1050

直捣黄龙~

这篇文章描述了一个矩阵寻路问题,要求计算从起点到终点的最短路径数量及长度。主要思路是通过BFS算法解决:首先标记哨兵警戒区域为禁区,然后从起点出发进行广度优先搜索,记录每个位置的最短步数和路径条数。当到达终点时,输出路径数和步数;若不可达则返回(0,0)。算法使用队列实现BFS,同时处理路径统计和步数记录,适用于网格寻路类问题。

面试高手的博客 215

android 创建型设计模式之单例模式

单例模式应该是Android开发中常见的一种设计模式。它的特点就是进程中只有一个实例。当我们的进程只需要类的一个对象的时候,我们就可以使用这种模式。它的好处就是避免频繁的创建和销毁这个类。比如数据库操作。 单例模式的特点: 全局只有一个实例。 由类本身创建其实例,即构造方法为private。 对外提供获取唯一实例的方法。 实现单例的几种方式: 1、饿汉式(恶汉式):在类加载的时候就创建类...

zxb3121999的专栏 232

Android系统修改驱动固定USB摄像头节点绑定前后置摄像头

Android系统中usb摄像头节点会因为摄像头所接的usb口不同或者usb设备识别顺序不一样而出现每次开机生成的video节点不一样的问题。由于客户app调用摄像头时,需要固定摄像头的节点。因此需要针对前面的情况做处理。

Android系统开发笔记 2250

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android 单例模式作用,Android实用设计模式之单例模式

什么是单例设计模式?单例模式是Java26种设计模式中的一种,日常开发中是非常常见的,其最大的特点是,帮助应用在运行某一个类时只会存在一个实例。使用单例模式的意义减少对象的创建,降低内存占用,提高代码的整洁性。举个例子,像有时候会创建一个数据管理类DataManager,里面会有缓存管理、线程池处理等一系列工具的实现,直接操作多类Data,这种一般就没有理由创建多个实例,也就是单例模式的使用场景。...

weixin_42398141的博客 166

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android常用设计模式之单例模式

单例模式是设计模式中简单也是常用的一种设计模式。 一.单例模式定义: 一个类有且仅有一个实例,并且自行实例化向整个系统提供。 二.单例模式的目的: 使得类的一个对象成为系统中的唯一实例。 三.单例模式的实现方式: 1.饿汉式 饿汉式是最简单的实现方式, /** *单例模式-饿汉式 */ publicclassSingleton{...

认真做事,开心生活 519

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android创建单例模式,Android单例模式Singleton简单实例设计模式解析.pdf

Android 单单例例模模式式 Singleton 简简单单实实例例设设计计模模式式解解析析单单例例模模式式 Singleton 简简单单实实例例设设计计模模式式解解析析前言今天我来全面总结一下A ndroid开发中最常用的设计模式 - 单例模式。关 设计模式的介绍,可以看下我之前写的:1分钟全面了解“设计模式”目录1. 引引入入1.1 解决的是什么问题之前说过,设计模式 = 某类特定问题的解...

weixin_30045055的博客 168

Android设计模式-单例模式(Singleton Pattern)

饿汉式 public class Singleton { //静态方法调用的变量必须是静态的 private static Singleton instance = new Singleton(); //必须定义一个静态方法获得该单例 public static Singleton getInstance() { return instance;

原氢的专栏 1181

Android开发学习笔记之设计模式——单例模式

文章目录Android开发学习笔记之设计模式——单例模式设计模式概述原则总原则:开闭原则六大原则分类单例模式概述优缺点应用场景实现懒汉模式饿汉模式双检锁模式(DCL模式)静态内部类实现单例枚举实现单例总结 Android开发学习笔记之设计模式——单例模式 设计模式 在我们进行开发的过程中,为了提高代码可读性以及可维护性等,我们可能就会有意或无意中接触到设计模式,比如最常见的单例模式、建造者模式和工厂模式等。 概述 设计模式是软件设计中常见问题的典型解决方案。 它们就像能根据需求进行调整的预制蓝图, 可用于解

qq_36425800的博客 388

Android设计模式系列-单例模式

Android设计模式系列-单例模式 单例模式,可以说是GOF的23种设计模式中最简单的一个。   这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式,本人很喜欢这个模式。 android中很多地方都用到了单例模式,本文以输入法管理者InputMethodManager为例,展开分析。 单例模式

巫山老妖 2347

Android设计模式之单例模式浅谈

一.前言: 在说设计模式之前,给大家推荐一本书 《Android源码设计模式解析与实战》——何红辉与关爱明著,这绝对是国内对设计模式的最佳阐述,两位作者都是安卓届的大神级人物,像何红辉就是AndroidEventBus的作者,其实这本书我还没看完,设计模式是软件工程的基石和脉络,如同大厦的结构一样,所以它不仅仅应用在Android方面,而是所有软件体系,可以这么说,如果你对设计模式理解很深,那么...

stay hungry stay foolish 419

android 单例模式的使用场景,android设计模式之单例模式

(其实设计模式应该从属于java,但是会专门针对android做相应的解释,所以就取名为android设计模式~)一.单例模式的介绍单例模式是应用最广的模式之一,在应用这个模式的时候,单例对象的类必须保证只有一个实例存在。在android中的应用场景例如整个app只有一个application对象,只有一个ImageLoader对象等。二.单例模式下的各种实现方式1.饿汉模式public clas...

weixin_42508185的博客 749

Android设计模式源码解析之单例模式

Android设计模式源码解析之单例模式 Android系统版本: 2.3 1. 模式介绍模式的定义确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

wanmeirongyan100的博客 346

Android设计模式——单例模式

真的了解单例设计模式吗1.单例设计模式2.使用套路3. 单例常用的几种方式3.1 单例——饿汉式3.2 单例——懒汉式3.3 单例——懒汉式(DCL)(常用)3.4 单例——静态内部类(常用)3.5 单例——容器管理(系统服务使用的方式,等下看下源码)3.6 单例——容器管理(系统中使用LayoutInflater源码)4.volatile关键字好处4.1 防止重排序4.2 线程可见性 4.2....

weixin_45468727的博客 391

Android源码设计模式——单例模式

实际上关于设计模式

lmq121210的博客 465
上一篇: 最新Android音视频进阶指南,跟着大神学音视频开发,事半功倍
下一篇: 2022上半年,一二线互联网公司Android面试题汇总(附解析)
Agent学习路线
博客等级 码龄6年 1万+粉丝 1902原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值