一、下面是大家都比较熟悉单例模式-饿汉式
public class Singleton {
public Singleton(){}
public static final Singleton singleton = new Singleton();
public static Singleton getInstance() {
return singleton;
}
}
二、怎么打破这种模式,创建多个实例对象呢?-序列化和反序列化
1.我们可以用流的方式将对象写到文件中在读取出来
注意: 写入到对象要实现序列化接口,也就是我们到singleten对象需要实现序列化接口
public class Test {
public static void main(String[] args) throws Exception{
Singleton singleton = Singleton.getInstance();
// 将对象写入到“abc.txt” 文件中
FileOutputStream fileOutputStream = new FileOutputStream("abc.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(singleton);
// 从文件中读取出来
FileInputStream fileInputStream = new FileInputStream("abc.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
Singleton singleton1 = (Singleton) objectInputStream.readObject();
// 打印2个对象
System.out.println(singleton);
System.out.println(singleton1);
}
}
2.查看打印结果
可以看到,2个对象的内存地址是不一致的
三、如何避免呢?
1.我们可以实现一个方法
private Object readResolve() {
return singleton;
}
2.代码如下
注意:这个方法通过工具idea 找不到,可以手写上去,名称是固定的.jvm会自动调用该方法.
3.我们在看下执行的结果
可以看到,打印的地址一致了.