设计模式--单例模式Demo

Singleton Pattern

1、什么是单例模式?(Singleton Pattern)

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

2、主要解决什么问题?

一个全局使用的类频繁地创建与销毁。

3、何时使用?

当您想控制实例数目,节省系统资源的时候。

4、如何解决?

判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

5、关键代码?

构造函数是私有的。

6、实现

6.1、懒汉式-线程不安全

/**
 * ClassName:LHanUnSafe
 * Describe: 懒汉式-线程不安全
 *          是否 Lazy 初始化:是
 *          是否多线程安全:否
 * Author:DGJ
 * Data:2021/3/2 10:26
 */
public class LHanUnSafe {
    private static LHanUnSafe lHanUnSafe;
    private LHanUnSafe(){}

    public static LHanUnSafe getInstance(){
        if(lHanUnSafe == null){
            return new LHanUnSafe();
        }
        return lHanUnSafe;
    }
}

6.2、懒汉式-线程安全

/**
 * ClassName:LHanSafe
 * Describe: 懒汉式-线程安全
 *          是否 Lazy 初始化:是
 *          是否多线程安全:是
 * Author:DGJ
 * Data:2021/3/2 10:29
 */
public class LHanSafe {
    private static LHanSafe lHanSafe;
    private LHanSafe(){}

    public static synchronized LHanSafe getInstance(){
        if(lHanSafe == null){
            return new LHanSafe();
        }

        return lHanSafe;
    }
}

6.3、饿汉式

/**
 * ClassName:EHan
 * Describe:饿汉式
 *          是否 Lazy 初始化:否
 *           是否多线程安全:是
 * Author:DGJ
 * Data:2021/3/2 10:31
 */
public class EHan {

    private static EHan eHan = new EHan();

    private EHan() {
    }

    public static EHan getInstance() {
        return eHan;
    }
}

6.4、双重校验锁


/**
 * ClassName:DoubleCheckingLockSingletonPattern
 * Describe: double-checked locking(双重校验锁)
 * 是否 Lazy 初始化:是
 * 是否多线程安全:是
 * Author:DGJ
 * Data:2021/3/2 10:34
 */
public class DoubleCheckedLockingSingletonPattern {
    private volatile static DoubleCheckedLockingSingletonPattern doubleCheckedLockingSingletonPattern;

    private DoubleCheckedLockingSingletonPattern() {
    }

    public static DoubleCheckedLockingSingletonPattern getInstance() {
        if (doubleCheckedLockingSingletonPattern == null) {
            synchronized (DoubleCheckedLockingSingletonPattern.class) {
                if (doubleCheckedLockingSingletonPattern == null) {
                    doubleCheckedLockingSingletonPattern = new DoubleCheckedLockingSingletonPattern();
                }
            }
        }
        return doubleCheckedLockingSingletonPattern;
    }

}

6.5、静态内部类

/**
 * ClassName:StaticSingletonPattern
 * Describe:静态内部类
 *          是否 Lazy 初始化:是
 *           是否多线程安全:是
 * Author:DGJ
 * Data:2021/3/2 10:38
 */
public class StaticSingletonPattern {
    private static class StaticSingletonPatternHolder {
        private static final StaticSingletonPattern STATIC_SINGLETON_PATTERN = new StaticSingletonPattern();
    }

    private StaticSingletonPattern() {
    }

    public static final StaticSingletonPattern getInstance() {
        return StaticSingletonPatternHolder.STATIC_SINGLETON_PATTERN;
    }
}

6.6、枚举

/**
 * ClassName:EnmuSingletonPattern
 * Describe: 枚举
 *          是否 Lazy 初始化:否
 *           是否多线程安全:是
 * Author:DGJ
 * Data:2021/3/2 10:44
 */
public enum  EnmuSingletonPattern {
    INSTANCE;
    public void getInstance(){
    }
}

posted @ 2021-03-10 20:14  一个努力的人QAQ  阅读(131)  评论(0编辑  收藏  举报