单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到。比如在Android实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenHelper)等都会用到单例模式。下面针对一些例子分析一下我们在开发过程中应用单例模式需要注意的点。

一、作用

单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点

二、适用场景

1. 应用中某个实例对象需要频繁的被访问。

2. 应用中每次启动只会存在一个实例。如账号系统,数据库系统。

三、常用的使用方式

(1)懒汉式

这是在开发中很容易就能写出来的一种方式,如下

public class Singleton {

/* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */

private static Singleton instance = null;

/* 私有构造方法,防止被实例化 */

private Singleton() {

}

/* 1:懒汉式,静态工程方法,创建实例 */

public static Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

调用:

Singleton.getInstance().method();

优点:延迟加载(需要的时候才去加载)

缺点: 线程不安全,在多线程中很容易出现不同步的情况,如在数据库对象进行的频繁读写操作时。

(2)加同步锁

既然线程不安全,那就加上同步锁,一种加法如下:

/*2.懒汉式变种,解决线程安全问题**/

public static synchronized Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

更一般的写法是这样

/*加上synchronized,但是每次调用实例时都会加载**/

public static Singleton getInstance() {

synchronized (Singletonclass) {

if (instance == null) {

instance = new Singleton();

}

}

return instance;

}

调用:

Singleton.getInstance().method();

优点:解决了线程不安全的问题。

缺点:效率有点低,每次调用实例都要判断同步锁

补充:在Android源码中使用的该单例方法有:InputMethodManager,AccessibilityManager等都是使用这种单例模式

(3)双重检验锁

要优化(2)中因为每次调用实例都要判断同步锁的问题,很多人都使用下面的一种双重判断校验的办法

/*3.双重锁定:只在第一次初始化的时候加上同步锁*/

public static Singleton getInstance() {

if (instance == null) {

synchronized (Singletonclass) {

if (instance == null) {

instance = new Singleton();

}

}

}

return instance;

}

这种方法貌似很完美的解决了上述效率的问题,它或许在并发量不多,安全性不太高的情况能完美运行,但是,这种方法也有不幸的地方。问题就是出现在这句

instance = new Singleton();

在JVM编译的过程中会出现指令重排的优化过程,这就会导致当 instance实际上还没初始化,就可能被分配了内存空间,也就是说会出现 instance !=null 但是又没初始化的情况,这样就会导致返回的 instance 不完整

调用:

Singleton.getInstance().method();

优点:在并发量不多,安全性不高的情况下或许能很完美运行单例模式

缺点:不同平台编译过程中可能会存在严重安全隐患。

补充:在android图像开源项目Android-Universal-Image-Loader中使用的是这种方式。

(4)内部类的实现

内部类是一种好的实现方式,可以推荐使用一下:

public class SingletonInner {

/**

* 内部类实现单例模式

* 延迟加载,减少内存开销

*

* @author xuzhaohu

*

*/

private static class SingletonHolder {

private static SingletonInner instance = new SingletonInner();

}

/**

* 私有的构造函数

*/

private SingletonInner() {

}

public static SingletonInner getInstance() {

return SingletonHolderinstance;

}

protected void method() {

Systemoutprintln("SingletonInner");

}

}

调用:

SingletonInner.getInstance().method();

优点:延迟加载,线程安全(java中class加载时互斥的),也减少了内存消耗

(5)枚举的方法

这是网上很多人推荐的一种做法,但是貌似使用的不广泛,大家可以试试,

/**

* @function:单例模式枚举实现

* @author xuzhaohu

*

*/

public enum SingletonEnum {

/**

* 从Java5开始支持;

* 无偿提供序列化机制;

* 绝对防止多次实例化,即使在面对复杂的序列化或者反射攻击的时候;

*/

instance;

private String others;

SingletonEnum() {

}

public void method() {

Systemoutprintln("SingletonEnum");

}

public String getOthers() {

return others;

}

public void setOthers(String others) {

thisothers = others;

}

}

调用:

SingletonEnum.instance.method();

优缺点:如代码中注释。

上面主要讲了单例模式5种创建方法,大家可以根据其优缺点进行个人实际项目中的使用。讲的属于抛砖引玉,大家多提意见。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android开发常用的设计模式,android开发设计模式之——单例模式详解相关推荐

  1. Web前端开发常用的十款开发工具汇总

    今天小编要跟大家分享关于Web前端开发常用的十款开发工具汇总 1.Glitch https://glitch.com 好的,这不仅仅是一个工具,还是一个非常棒的编码平台以及一个很棒的技术社区.我可以在 ...

  2. Android基础入门教程——2.3.1 TextView(文本框)详解

    Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解And ...

  3. Android studio 多渠道(多环境)打包grade配置详解

    Android studio 多渠道(多环境)打包grade配置详解 场景:开发app,我们需要两套环境或者两套环境以上的apk,每套环境的apk分两个版本debug版和release版. 公司有套平 ...

  4. java connection 单例_Java设计模式之单例模式详解

    Java设计模式之单例模式详解 什么是设计模式 设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可 ...

  5. 四.卡尔曼滤波器(EKF)开发实践之四: ROS系统位姿估计包robot_pose_ekf详解

    本系列文章主要介绍如何在工程实践中使用卡尔曼滤波器,分七个小节介绍: 一.卡尔曼滤波器开发实践之一: 五大公式 二.卡尔曼滤波器开发实践之二:  一个简单的位置估计卡尔曼滤波器 三.卡尔曼滤波器(EK ...

  6. IOS开发环境更换后重新制作Provisioning Profile证书详解

    IOS开发环境更换后重新制作Provisioning Profile证书详解 新换了台Macbook,又折腾了一遍Provisioning Profile证书,苹果的证书繁锁复杂,每次制作都相当麻烦, ...

  7. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  8. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  9. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  10. android相册和拍照并裁剪图片大小,Android 拍照并对照片进行裁剪和压缩实例详解...

    Android 拍照并对照片进行裁剪和压缩实例详解 本文主要介绍 Android 调用摄像头拍照并对照片进行裁剪和压缩,文中给出了主要步骤和关键代码. 调用摄像头拍照,对拍摄照片进行裁剪,代码如下. ...

最新文章

  1. leetcode 279. 完全平方数 bfs广度优先解法 图解 动态规划解法 c代码
  2. 210326阶段三人脸识别
  3. 部署php项目到linux
  4. php 模块 远程,ThinkPHP远程调用模块的操作方法 URL 参数格式
  5. python类:class创建、数据方法属性及访问控制(下划线)
  6. matlab求最大公约数和最小公倍数
  7. 电源大师课笔记 2.4
  8. android开发案例1---拦截电话,拯救史迪仔,有序广播
  9. 华硕笔记本linux触摸板驱动,华硕触摸板驱动,手把手教你如何在华硕官网触控板驱动...
  10. 1的阶乘加到20的阶乘
  11. 《自卑与超越》读书笔记
  12. 【IJCAI 2022】参数高效的大模型稀疏训练方法,大幅减少稀疏训练所需资源
  13. Word2013设置多级标题自动编号
  14. python小游戏——魂斗罗这是你的童年吗?
  15. ISO9000中服装加工行业应执行哪些检验标准?
  16. 西储大学轴承数据小波变换
  17. Python教程系列(一)—— Python基础教程之导言
  18. nginx集群与高并发
  19. 【初等数论】整除、公约数、同余与剩余系
  20. el-cascader 级联选器中实现任意级别都可选,且前两级别为必选

热门文章

  1. 密度聚类算法DBSCAN实战及可视化分析
  2. 核磁共振影像数据处理-2-DWI实践:计算ADC (MD) map、Li‘s have a solution and plan.
  3. 学术 科研 论文写作 生物信息学
  4. DNA测序,第一代DNA测序,第二代DNA测序,第三代DNA测序,sanger法
  5. NGS的测序仪和相关技术时间轴 NGS相关数据库和项目时间轴
  6. java 数值区间_java 各数据类型数值范围
  7. python librosa 或 ffmpeg 改变音频采样率
  8. Python通过http、url获取数据
  9. 【统计学习方法】线性可分支持向量机对鸢尾花(iris)数据集进行二分类
  10. LeetCode 709 To Lower Case -- java,python解法