枚举单例 代码如下
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 如图所示代码如下