欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Java设计模式】单例模式

程序员文章站 2022-07-14 09:06:45
...

【博主声明】欢迎审阅,未经许可,请勿转载,谢谢!

设计模式相关文章

建造者模式 —— 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

@作者博客:_Xu2WeI

@更多博文:查看作者的更多博文