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

原创 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();反序列化的时候,只是简单的恢复数据来创建对象,并没有去调用任何的构造器,

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

编写一个单例类

在面试的时候,单例模式是经常被提问到的,编写一个Singleton类,可以更好的向面试官展现出自己对单例模式的理解。下面我列举出四个方式在展示Singleton类 1.简单的方式,但这个有一个缺点,...
  • ranxiaoxu123
  • ranxiaoxu123
  • 2016年08月23日 15:13
  • 1477

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

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

【Java Web】源码分析Java Web的Filter与Struts的Interceptor是不是单例

Java Web中的Filter与Struts中的Interceptor到底是不是单例的? 答案首先是,它们都是单例的。下面我就从源码角度去解释为什么是单例的。 首先我们先对Interceptor进行...
  • s120922718
  • s120922718
  • 2013年05月16日 11:30
  • 2539

Struts2的Action是单例还是多例 / SpringMVC的controller默认是单例还是多例?

Struts2的Action是单例还是多例?Spring的controller默认是单例还是多例?1、默认单例SpringMVC默认是单例的。与Struts2不同,SpringMVC没有默认处理方法,...
  • chengyuqiang
  • chengyuqiang
  • 2017年12月11日 21:05
  • 485

关于Holder持有者类对象

经常遇到这样的功能,想调用一次方法时希望放回多个对象。 可是return语句却只允许返回一个对象,因此,解决办法只有创建一个对象,用它来持有想要返回的多个对象。 如,可以创建一个DataHolder类...
  • itzyjr
  • itzyjr
  • 2013年10月31日 03:08
  • 1397

Struts2中Action的单例与多例

struts2中action是多例的,即一个session产生一个action背景:1) Struts2会对每一个请求,产生一个Action的实例来处理. 2) Spring的Ioc容器管理的bea...
  • marksman0223
  • marksman0223
  • 2016年12月06日 00:12
  • 2156

如何设计各种类

设计类Course假设需要处理课程信息,没门课程都有一个名字以及选课的学生。要能够向/从这个课程添加/删除一个学生,可以使用一个类来对课程建模。 向构造方法Course(String name...
  • nhgfd
  • nhgfd
  • 2016年09月21日 09:52
  • 407

Java第六次实验要求

实验六 继承与接口(二) 一、 实验目的1、 掌握Java语言中final关键字的含义及使用方法;2、 掌握Java语言中上转型对象的基本概念及利用上转型对象实现多态的方法;3、 掌握Java语言中抽...
  • laoduan_78
  • laoduan_78
  • 2016年04月12日 21:43
  • 1899

自己封装的一个工具类

工具类包含的方法: 1.dip到px的转换; 2.2.让代码运行到主进程的方法; 3.3.获取随机颜色的值的方法; 4.4.获取一个带背景颜色的圆角矩形的方法; 5.设置...
  • lrpshuai
  • lrpshuai
  • 2016年11月16日 11:30
  • 435

spring自动注入是单例还是多例?单例如何注入多例?

spring自动注入是单例还是多例?单例如何注入多例?
  • Jasonbeans
  • Jasonbeans
  • 2017年04月17日 15:09
  • 9144
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:怎么让一个单列类能够变成多例的类
举报原因:
原因补充:

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