一 问题演示
1 破坏单例模式
除枚举方式外,其它单例类(Singleton)可以创建多个对象。有两种方式可以破坏单例模式,分别是序列化和反射。
1.1 序列化反序列化
Singleton类:
public class Singleton implements Serializable {
// 私有构造方法
private Singleton() {
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
// 对外提供静态方法获取该对象
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
Test类:
public class Test {
public static void main(String[] args) throws Exception {
// 往文件中写对象
// writeObject2File();
// 从文件中读取对象
Singleton s1 = readObjectFromFile();
Singleton s2 = readObjectFromFile();
// 判断两个反序列化后的对象是否是同一个对象
System.out.println(s1 == s2);
}
private static Singleton readObjectFromFile() throws Exception {
// 创建对象输入流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\Think\\Desktop\\a.txt"));
// 第一个读取Singleton对象
Singleton instance = (Singleton) ois.readObject<