设计模式-单例模式

一个类只能有一个实例

主要有两种,饿汉和懒汉模式。

  • 饿汉: 直接初始化
  • 懒汉: 使用的时候才初始化
/**
 * @Classname 单例模式
 * @Description TODO
 * @Date 2021/9/23 17:24
 * @Created by huangsm
 */
public class 单例模式 {
    /**
     * 一个类只能存在一个对象实例
     *
     * @param args
     */
    public static void main(String[] args) {
        //java代码典型使用,使用的是静态变量
        Runtime runtime = Runtime.getRuntime();
    }
}

/**
 * 饿汉模式(静态变量)
 */
class SingletonStatic {
    //通过静态变量直接初始化
    private final static SingletonStatic instance = new SingletonStatic();

    //私有构造方法
    private SingletonStatic() {
    }

    //所有其他类通过此方法拿到静态变量
    public static SingletonStatic getInstance() {
        return instance;
    }
}

/**
 * 饿汉模式(静态代码块)
 */
class SingletonStaticBlock {
    //创建内部对象
    private static SingletonStaticBlock instance;

    //在静态代码块中创建单例对象
    static {
        instance = new SingletonStaticBlock();
    }

    //私有构造方法
    private SingletonStaticBlock() {
    }

    //所有其他类通过此方法拿到静态变量
    public static SingletonStaticBlock getInstance() {
        return instance;
    }
}

/**
 * 懒汉模式(线程不安全)
 */
class SingletonUnSafe {
    //创建内部对象
    private static SingletonUnSafe instance;

    //私有构造方法
    private SingletonUnSafe() {
    }

    //所有其他类通过此方法拿到静态变量
    public static SingletonUnSafe getInstance() {
        if (instance == null) {
            instance = new SingletonUnSafe();
        }
        return instance;
    }
}

/**
 * 懒汉模式(同步方法)
 */
class SingletonSync {
    //创建内部对象
    private static SingletonSync instance;

    //私有构造方法
    private SingletonSync() {
    }

    //所有其他类通过此方法拿到静态变量
    public static synchronized SingletonSync getInstance() {
        if (instance == null) {
            instance = new SingletonSync();
        }
        return instance;
    }
}

/**
 * 懒汉模式(同步代码块)
 */
class SingletonSyncBlock {
    //创建内部对象
    private static SingletonSyncBlock instance;

    //私有构造方法
    private SingletonSyncBlock() {
    }

    //所有其他类通过此方法拿到静态变量
    public static SingletonSyncBlock getInstance() {
        if (instance == null) {
            synchronized (SingletonSyncBlock.class) {
                instance = new SingletonSyncBlock();
            }
        }
        return instance;
    }
}

/**
 * 双重检查
 */
class SingletonDoubleCheck {
    //创建内部对象
    private static volatile SingletonDoubleCheck instance;

    //私有构造方法
    private SingletonDoubleCheck() {
    }

    //所有其他类通过此方法拿到静态变量
    public static SingletonDoubleCheck getInstance() {
        if (instance == null) {
            synchronized (SingletonSyncBlock.class) {
                if (instance == null) {
                    instance = new SingletonDoubleCheck();
                }
            }
        }
        return instance;
    }
}

/**
 * 静态内部类
 */
class SingletonStaticClass {
    //创建内部对象
    private static volatile SingletonStaticClass instance;

    //私有构造方法
    private SingletonStaticClass() {
    }

    //所有其他类通过此方法拿到静态变量
    public static SingletonStaticClass getInstance() {
        return Singleton.INSTANCE;
    }

    private static class Singleton {
        private static final SingletonStaticClass INSTANCE = new SingletonStaticClass();
    }
}

/**
 * 枚举类
 */
enum SingletonEnum {
    INSTANCE;
}

posted @ 2021-12-06 15:20  雾里看花的少年  阅读(35)  评论(0编辑  收藏  举报