如何打破单例模式?又如何避免?

一、下面是大家都比较熟悉单例模式-饿汉式

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.我们在看下执行的结果

在这里插入图片描述
可以看到,打印的地址一致了.

发布了17 篇原创文章 · 获赞 0 · 访问量 258

猜你喜欢

转载自blog.csdn.net/weixin_40980639/article/details/100643909
今日推荐