Android 设计模式 笔记 - 单例模式

Posted 鲨鱼丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 设计模式 笔记 - 单例模式相关的知识,希望对你有一定的参考价值。

定义:

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

实现单例模式的关键点:

  1. 构造函数不对外开放
  2. 通过静态方法或者枚举返回单例类对象。
  3. 确保单例类的对象只有一个,不管是不是多线程
  4. 在反序列化的时候不会出现重新构建单例对象的情况

单例模式实现方法:

  • 懒汉模式

简单代码“

package com.mabin.gradle.eg.singleton;

/**
 * 懒汉模式下的单例
 * 一定程度的节约了资源,但是第一次加载的时候反应稍慢,另外最大的问题是每次调用getInstance都进行都不,造成不必要的同步开销。
 * 不建议使用
 * Created by binbin.ma on 2016/7/1.
 */
public class Singleton 
    private static Singleton instance ;
    private Singleton()
    public static synchronized Singleton getInstance()
        if (instance == null)
            instance = new Singleton() ;
        
        return instance ;
    



我在大学时代用的单例模式全是这种。这种的唯一的优点就是容易记。但是不推荐使用,首先只是看代码就可以看出来一个问题:即使intance已经被初始化了,每次调用get的时候还是会进行同步,消耗了很多不必要的同步开销。

  • Double Check Lock(DCL)实现

简单代码:

package com.mabin.gradle.eg.singleton;

/**
 * DCL单例模式
 * 优点:资源利用率高,缺点:第一次加载反应稍慢,并且由于JAVA内存的原因会偶尔失败。
 * Created by binbin.ma on 2016/7/1.
 */
public class DCLSingleton 
    private static DCLSingleton sInstance = null ;
    private DCLSingleton()
    public static DCLSingleton getInstance()
        if (sInstance == null)
            synchronized (DCLSingleton.class)
                if (sInstance == null)
                    sInstance = new DCLSingleton();
                
            

        
        return  sInstance ;
    


Double Check lock 双重检查锁定,顾名思义,get方法进行了两次instance为不为null的判定。第一次判断主要是避免了懒汉模式中的问题:不必要的同步。第二次
则是为了在instabce为null的时候创建实例。
优点:资源利用率较高,第一次实现gei方法单例才会实现实例化。
缺点:第一次加载比较慢,但是由于java版本的问题和高并发环境下可能会出现失败的情况,概率较小。

  • 静态内部类单例模式

简单代码:

package com.mabin.gradle.eg.singleton;

/**

 * 推荐使用,同时解决前面DCL和懒汉模式下的单例模式
 * Created by binbin.ma on 2016/7/1.
 */
public class StaticSingleton 
    private StaticSingleton()

    public static StaticSingleton getInstance()
        return SingletonHolder.sInstance;
    

    private static class SingletonHolder
        private static final StaticSingleton sInstance = new StaticSingleton();
    


优点:不仅能够实现线程安全还可以确保单例对象的唯一性,延迟了单例的势力化。


 

上面的几种实现方法都可能出现重新创建对象的情况,即反序列化。规避这种情况的方法是加入一个方法:

   private Object readResolve() throws ObjectStreamException 
        return instance;
    

就是使用readResolve方法将instance返回,而不是重新生成对象。


  • 枚举单例

简单代码:

package com.mabin.gradle.eg.singleton;

/**
 * 枚举单例模式
 * Created by binbin.ma on 2016/7/1.
 */
public enum SingletonEnum 
    INSTANCE ;


优点:写法简单,枚举实例的创建时线程安全的,在任何情况下他都是一个实例。很好了避免了上述几种实例化方法出现的反序列化的情况。



以上是关于Android 设计模式 笔记 - 单例模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式:学习笔记——单例模式

设计模式学习笔记之 单例模式

Android常用设计模式-单例模式

Android - 设计模式

Android设计模式-单例模式

设计模式与Android单例模式——独一无二的皇帝