单例模式

Posted 麋鹿双子

tags:

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

1.单例模式:保证整个系统中一个类只能有一个实例,而且这个实例只能是自身创建。外部不能直接创建对象(不能new)只能通过类中的固定方法获取。

2.单例模式类型:

  01.懒汉式:(在调用的时候实例化)

技术分享
public class DanLi {

    // 私有化构造,防止外部直接调用
    private DanLi() {
    }

    // 创建私有化的变量
    private static DanLi danLi = null;

    // 创建静态工厂
    public static DanLi getInstance() {
        if (danLi == null) {
            danLi = new DanLi();
        }
        return danLi;
    }

}
懒汉

    线程不安全,当多个线程同时调用该方法的时候,就会创建多个实例。为了实现线程安全可以采用:

    001.添加同步校验锁

技术分享
public class DanLi {

    // 私有化构造,防止外部直接调用
    private DanLi() {
    }

    // 创建私有化的变量
    private static DanLi danLi = null;

    // 创建静态工厂
    public static synchronized DanLi getInstance() {
        if (danLi == null) {
            danLi = new DanLi();
        }
        return danLi;
    }

}
同步锁

    002.双重锁

技术分享
public class DanLi {

    //私有化构造,防止外部直接调用
    private DanLi(){}
    //创建私有化的变量
    private static DanLi danLi = null;
    //创建静态工厂
    public static synchronized DanLi getInstance(){
        if (danLi == null) {
            synchronized (DanLi.class) {
                if (danLi == null) {
                    danLi = new DanLi();
                }
            }
        }
        return danLi;
    }
    
}
双重锁

    003.静态内部类

技术分享
public class DanLi {

    // 私有化构造,防止外部直接调用
    private DanLi() {
    }

    private static class LazyHolder {
        private static final DanLi INSTANCE = new DanLi();
    }

    // 创建静态工厂
    public static DanLi getInstance() {
        return LazyHolder.INSTANCE;
    }

}
静态内部类

  02.饿汉式:(在初始化时自动进行实例化)

    在创建类的同时就已经创建好了一个静态的对象供系统使用,以后也不会再改变,故线程安全

技术分享
public class DanLi {

    // 私有化构造,防止外部直接调用
    private DanLi() {
    }

    private static final DanLi danli = new DanLi();
    
    public static DanLi getInstance(){
        return danli;
    }

}
饿汉

 

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

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块