import java.io.Serializable;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.ObjectStreamException;
public class SingleTest
{
public static void main(String[] args) throws Exception
{
SingleObject singleObject = SingleObject.getSingleObject();
System.out.println("ID="+singleObject.getID());
SingleObject singleObject1 = SingleObject.getSingleObject();
System.out.println("singleObject==singleObject1 is "+(singleObject==singleObject1));
//Serialized the object .
FileOutputStream fos = new FileOutputStream("singleObject.file");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(singleObject);
oos.flush();
oos.close();
//Deserialized the object
FileInputStream fis = new FileInputStream("singleObject.file");
ObjectInputStream ois = new ObjectInputStream(fis);
SingleObject so = (SingleObject)ois.readObject();
ois.close();
//Deserialized the object
fis = new FileInputStream("singleObject.file");
ois = new ObjectInputStream(fis);
SingleObject so1 = (SingleObject)ois.readObject();
ois.close();
System.out.println(so==so1);
}
}
class SingleObject implements Serializable
{
private static SingleObject so = new SingleObject();
private int ID;
private SingleObject()
{
ID++;
}
public static SingleObject getSingleObject(){
return so;
}
public int getID(){
return ID;
}
// this method is called automently while deserialized and return the object
private Object readResolve() throws ObjectStreamException
{
return so;
}
}
下面讨论了实现单例模式的一种特殊情况,也就是某个单例类在实现序列化接口的时候应该注意的问题:在JDK1.2之前若要实现单例类就不应该
实现Serializable接口,否则可以通过多次反序列化来得到多个对象。JDK1.2之后,若实现了Serializable接口还必须通过自己定义readSolve()
方法这样可以控制每次反序列化时返回同一个对象。当实现了Cloneable接口时,调用clone方法也可能获得多个实例而不是单例。
public class CloneSingletonTest
{
public static void main(String[] args)throws CloneNotSupportedException{
SingletonClone SingleOne = SingletonClone.getSingleObject();
System.out.println(SingleOne);
SingletonClone SingleTwo = (SingletonClone)SingleOne.clone();
System.out.println(SingleTwo);
}
}
class SingletonClone implements Cloneable //实现Cloneable接口
{
private static SingletonClone sc = new SingletonClone();
private SingletonClone(){} //私有构造方法
public Object clone() throws CloneNotSupportedException{ //public 的clone方法
return super.clone();
}
public static SingletonClone getSingleObject(){
return sc;
}
}