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

                         【声明】:未经许可,禁止转载!

博主的设计模式相关文章推荐

Android设计模式之建造者模式 —— Builder Pattern

· 介绍

    今天,我们来学习设计模式中最简单一种模式之一就是 —— 单例模式(singleton pattern) 。那么何为单例模式呢?它主要在程序中起到什么作用?为什么要使用这种模式以及它的模板代码?带着前面几个问题,我们一一解剖这个所谓的单例模式。

· 单例模式

单例,从命名的名词角度来解释,它的意思是仅存的一个实例。没错,其实它就是这个意思。而在我们程序中,它也是仅仅存在的一个全局的实例,也就是实例化一次。它的创建只能通过自身来实例化,仅提供外部的一个唯一的访问自己的方法。

   · 单例模式的特点:

        1、仅有一个实例

        2、自己实例化自己

        3、提供一个唯一访问自身实例的方法

   · 单例模式的作用:

        保证自身的唯一性,以确保数据的准确、唯一。在多线程情况下,多次访问数据对其进行操作则会造成数据紊乱,而使用单例则能确保数据是准确了。

   · 单例模式的实现方式:

       单例模式的实现方式主要有4种,也是我们最经常写的几种,我们分别看它们的实现方式以及区别。

     一、懒汉式(线程安全)

            优点:使用时才实例化,避免内存开销。

            缺点:synchronized关键字会导致效率降低。

/**
 * @Created by xww.
 * @Creation time 2018/8/14.
 */

public class Singleton {
    private static Singleton instance;

    public static synchronized Singleton getIns() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

     二、饿汉式(线程安全)

           优点:没有synchronized枷锁,效率提升。

           缺点:在类转载时实例化,导致内存开销增大。

/**
 * @Created by xww.
 * @Creation time 2018/8/14.
 */

public class Singleton {
    private static final Singleton instance = new Singleton();

    public static Singleton getIns() {
        return instance;
    }
}

     三、双重校验锁(线程安全)

           优点:使用双重校验锁机制,在多线程中依然保持高效率,而且在使用时才实例化,综合以上两个优缺点于一身。

           缺点:据说这是最推崇的一种单例写法,在安卓源码中也有这样写的,所以暂时不知道有什么缺点。

/**
 * @Created by xww.
 * @Creation time 2018/8/14.
 */

public class Singleton {
    private volatile static Singleton instance;

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

     四、静态内部类(线程安全)

           优点:在使用时才实例化,综合以上两个优缺点于一身。与双重校验锁的方式相比,实现方式简单了点。

           缺点:暂时不知道有什么缺点,应该逼格没有双重校验锁高吧。

/**
 * @Created by xww.
 * @Creation time 2018/8/14.
 */

public class Singleton {

    private static class Holder {
        private static final Singleton instance = new Singleton();
    }

    public static Singleton getIns() {
        return Holder.instance;
    }
}

  枚举类(线程安全)

     枚举类也是线程安全的,它最简洁,是单例模式的最佳方式,支持序列化机制,防止被多次的实例化。

   · 单例模式的使用方式比较:

         一般建议使用饿汉式,不建议使用懒汉式。

         如果在类装载过于耗时的处理时,使用静态内部类方式,要用才实例化,也可以用双重校验锁方式。

         如果需要反序列化,用枚举类的方式。

©版权所有:https://blog.csdn.net/smile_Running/article/details/81676402

猜你喜欢

转载自blog.csdn.net/smile_Running/article/details/81676402