怎么让一个单列类能够变成多例的类

原创 2012年03月23日 17:22:45

我们知道一个单例类正常情况下只可以产生一个实例,为了能够达到将单例类转换成多例类(这里纯粹为了实现而实现没有必要)

我们可以让单例类实现Serializable接口,进行序列化

然后反序列化,在进行反序列时,由于单例类实现了序列化接口,因此会自动创建新的类,到达多例的效果

如果任然想在 单例类实现了序列化接口的情况下 依旧产生单例类 可以在单例类中加入readResolve()方法

 

package com.java.single;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamException;
import java.io.Serializable;
/**
 * 我们知道一个单例类正常情况下只可以产生一个实例,为了能够达到将单例类转换成多例类(这里纯粹为了实现而实现没有必要)
 * 我们可以让单例类实现Serializable接口,进行序列化
 * 然后反序列化,在进行反序列时,由于单例类实现了序列化接口,因此会自动创建新的类,到达多例的效果
 * 如果任然想在 单例类实现了序列化接口的情况下 依旧产生单例类 可以在单例类中加入readResolve()方法
 */
public class Data {
	//序列化
	public static void writeObject() throws Exception{
		Worm worm = Worm.getInstance();
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("d://worm.out"));
		out.writeObject(worm);
		out.close();//关闭的同时也刷新清空了缓冲区
	}

	//反序列化
	public static Worm readObject() throws Exception{
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("d://worm.out"));
		Worm readWorm = (Worm) in.readObject();
		return readWorm;
	}

	public static void main(String[] args) throws Exception{
//		writeObject();
		Worm worm1 = readObject();
		Worm worm2 = readObject();
		System.out.println(worm1 == worm2);
	}
}


class Worm implements Serializable{
	private static final long serialVersionUID = 1L;
	private static Worm instance = new Worm();//私有的实例成员,在类加载的时候就创建好了单例对象

	private Worm() {//私有构造方法,避免外部创建实例


	}
	public static Worm getInstance(){//仅此有一个公开的静态方法,得到一个实例
		return instance;//返回实例
	}

	/**
	 * 如果采用了单例的类实现了序列化接口后,在进行反序列时,会自动创建新的类,
	 * 为了解决这个问题,可以采用readResolve()方法
	 */

//	private Object readResolve() throws ObjectStreamException {   
//		return instance;   
//	}   

}


 为什么反序列化会产生新的对象了

 

 因此Worm readWorm = (Worm) in.readObject();反序列化的时候,只是简单的恢复数据来创建对象,并没有去调用任何的构造器,

 也就无法判断改对象实例是否已经存在了,所以反序列化出来的都是 新的对象

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

单例模式之多例类【设计模式】

单例模式:单例模式 多例类:请使用单例模式编写一个程序,然后考虑一下如何对这个程序进行改造,使得系统中某个类的对象可以存在有限多个,例如两例或三例? 法一:最多有max_num种实例,如果调用...

Spring 创建对象的问题,不同构造方法创建对象,使用工厂类类获取对象、单例或多例、延迟创建问题

Spring 创建对象的问题,不同构造方法创建对象,使用工厂类类获取对象、单例或多例、延迟创建问题。

多例模式之有上限多例类

一个实例数目有上限的多例类已经把实例的上限当做逻辑的一部分,并建造了多例类的内部,这种模式叫做有有上限的多例模式。 比如在每一麻将牌局都需要两个骰子,因此骰子就应当是双态类,这里就以这个系统为例,说明...

第六周实验指导--任务四--设计一个三角形类,能够输入三角形的三个顶点,求出其面积、周长。

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生  * All rights reserved. * 文件名称:设计...

第六周任务四设计一个三角形类,能够输入三角形的三个顶点,求出其面积、周长,并判断其是否为直角三角形和等腰三角形。

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称: ...

《C++第六周实验报告4-1》---设计一个三角形类,能够输入三角形的三个顶点,求出其面积、周长,并判断其是否为直角三角形和等腰三角形。

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称: CT...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)