单例模式(三)最佳实践枚举单例与ThreadLocal的单例

291 阅读1分钟

枚举单例 代码如下

package com.zw.design.pattern.creational.singleton.hungry.enums;

/****
 * 枚举单例模式 是最优雅和最佳的实现
 * 也是线程安全的 可以避免反射攻击的单例
 */
public enum EnumInstance {
    INSTANCE;
    private  Object object;

    public void setObject(Object object) {
        this.object = object;
    }

    public Object getObject() {
        return object;
    }

    public static EnumInstance getInstance(){
        return INSTANCE;
    }
}

2.测试类

package com.zw.design.pattern.creational.singleton.hungry.enums;

import com.zw.design.pattern.creational.singleton.hungry.HungryLazySingleton;

import java.io.*;

/****
 * 序列化破坏单例模式
 */
public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {

        EnumInstance hungryLazySingleton=EnumInstance.getInstance();
        //序列化
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("singleton_file"));
        oos.writeObject(hungryLazySingleton);
        //读取操作
        File file=new File("singleton_file");
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
        EnumInstance newLazySingleton  = (EnumInstance) ois.readObject();
        System.out.println("newLazySingleton = " + newLazySingleton);
        System.out.println("hungryLazySingleton = " + hungryLazySingleton);
        //输出两个对象是否是相等的?
        System.out.println(newLazySingleton==hungryLazySingleton);
    }
}

3.编写 ThreadLocalInstance单例模式

package com.zw.design.pattern.creational.singleton.threadlocal;

/***
 * 空间换时间的单例模式
 * 在这个线程当中 获取到这个对象是唯一的
 */
public class ThreadLocalInstance {
    private  static final ThreadLocal<ThreadLocalInstance> threadLocalInstance=new InheritableThreadLocal<ThreadLocalInstance>(){
        @Override
        protected ThreadLocalInstance initialValue() {
            return new ThreadLocalInstance();
        }
    };

    private ThreadLocalInstance(){

    }

    public static ThreadLocalInstance getThreadLocalInstance() {
        return threadLocalInstance.get();
    }
}

5.测试类这里就不写了 测试代码都在代码如下当中 6.单例模式 在spring mybatis 框架当中的使用 如图所示 6.1 spring 当中这个类AbstractFactoryBean在这里插入图片描述在这里插入图片描述 在mybatis 当中使用 该类ErrorContext 如图所示在这里插入图片描述代码如下