设计模式-单例模式

单例模式

懒汉模式

class LazySingleton {
    //volatile 防止指令重排
    private volatile static LazySingleton lazySingleton;
    //私有化构造方法
    private LazySingleton(){
        //不能防止反射机制创建对象的攻击
        ....................
    }
    //提供公共的实例化方法
    public static LazySingleton getInstanece(){
        if (lazySingleton == null){
            //解决多线程安全问题
            synchronized (LazySingleton.class){
                //双重判断
                if (lazySingleton == null){
                    lazySingleton = new LazySingleton();
                }
            }
        }
        return lazySingleton;
    }
}

饿汉模式

class HungrySingleton{
    //通过类的加载 创建单个实例
    private static HungrySingleton instance = new HungrySingleton();
    private HungrySingleton(){
        //防止通过反射机制攻击单例模式
        if (instance != null){
            throw new RuntimeException("单例模式不能创建多个实例");
        }
    }
    public static HungrySingleton getInstance(){
        return HungrySingleton.instance;
    }
}

静态内部类

class InnerSingleton {

    private InnerSingleton() {
        //防止通过反射机制创建实例改变单例模式的攻击
        if(InnerSingletonHolder.instance != null){
            throw new RuntimeException("单例模式不能创建多个实例");
        }
    }

    //静态内部类
    private static class InnerSingletonHolder {
        //通过虚拟机类加载的方式保证单例
        private static InnerSingleton instance = new InnerSingleton();
    }

    //只有调用InnerSingleton.getInstance方法的时候才会创建实例(实际也是懒加载的一种方式)
    public static InnerSingleton getInstance() {
        return InnerSingletonHolder.instance;
    }
}

枚举类实现单例模式

enum EnumSingleton {
    SINGLETON;
    public void print(){
        System.out.println(this.hashCode());
    }
}

//调用方式
EnumSingleton.SINGLETON.print();
posted @ 2021-06-30 16:30  紫川先生  阅读(21)  评论(0编辑  收藏  举报