`
xinglongbing
  • 浏览: 151150 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

单例模式实现时要注意的问题

阅读更多
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;
	}
}

 

分享到:
评论

相关推荐

    7种单例模式

    下面将详细介绍七种常见的单例模式实现方式,并结合多线程环境和反序列化测试进行讨论。 1. **饿汉式单例**: 这是最简单的单例实现,它在类加载时就创建了实例,因此是线程安全的。 ```java public class ...

    单例模式单例模式单例模式

    在给定的内容中提到的`Martin`类就是一个典型的单例模式实现案例。它通过将构造器私有化以及提供一个静态成员变量来确保了`Martin`类的唯一实例的存在。 ```java public class Martin { private Martin() { // ...

    设计模式——单例模式

    懒汉式单例模式则是在第一次调用 `getInstance()` 方法时才创建实例,实现了真正的按需创建。但由于多线程环境下可能出现多个实例,因此需要进行同步控制。 ```java public class Singleton { private static ...

    C++实现的单例模式代码

    总结来说,C++中的单例模式实现要考虑线程安全和生命周期管理,尤其是在多线程环境下。上述的三种方法分别适用于不同的场景,开发者应根据实际需求选择合适的方式。在实际编程中,还需注意防止内存泄漏,确保单例...

    单例模式(Singleton)的6种实现

    接下来,我们详细介绍六种不同的单例模式实现方法。 1. 饿汉式(Eager Initialization) 饿汉式是一种简单的单例实现方式。在类加载时,单例对象就已经创建。这种实现方式的优点是实现简单,但缺点是不管是否使用,...

    单例模式,single

    经典的单例模式实现如以下示例所示: ```java public class ClassicSingleton { private static ClassicSingleton instance = null; protected ClassicSingleton() { // 存在仅为了防止实例化 } public ...

    单例模式介绍

    单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类在整个程序运行期间只有一个实例存在。...同时,理解并掌握单例模式的实现方式及其在特定环境下的注意事项,是每个Android开发者必备的知识。

    JAVA单例模式的几种实现方法

    ### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...

    单例模式详解

    在复杂的系统架构中,还需要考虑多线程、多类加载器、跨JVM等特殊场景下的单例模式实现。 通过本文的介绍,我们可以看到单例模式不仅限于一个简单的类实现,还可以根据不同的应用场景进行扩展和优化。在软件开发...

    设计模式-单例模式(讲解及其实现代码)

    需要注意的是,单例模式可能会导致程序设计过于紧密耦合,不易于测试和扩展。因此,在使用单例时需谨慎,避免滥用。此外,如果需要依赖注入,可以考虑使用`Dependency Injection`框架来代替硬编码的单例。

    深入探索Java中的单例模式:实现、应用与最佳实践

    本文将详细介绍几种常见的单例模式实现方式,并探讨它们在实际开发中的应用和最佳实践。 在实现单例模式时,应注意以下几点: 确保单例类不被继承,可以通过将构造函数设置为私有来实现。 考虑线程安全问题,选择...

    设计模式-单例模式

    以上就是Java中常见的单例模式实现方式,每种方式都有其适用场景和优缺点。在实际开发中,应根据项目需求和环境选择合适的方法。例如,如果对性能要求较高,可能会选择静态内部类或枚举方式;如果需要考虑序列化问题...

    Qt qml Singleton 单例模式

    在Qt的Qml环境中,单例模式是一种设计模式,它允许在整个应用程序中创建一个全局访问点,确保某个类只有一个实例存在。这样的设计模式在需要共享数据或者服务时非常有用,避免了多处创建相同对象导致的数据不一致或...

    单例模式代码.rar

    在压缩包文件"课堂演示代码"中,可能包含了以上各种单例模式实现的示例代码,供学习者理解和实践。通过这些代码,你可以亲手运行并观察不同实现方式的效果,进一步理解单例模式的工作原理及其在Java中的应用。

    Java单例模式深入理解

    在Java中,常见的单例模式实现方式有以下几种: 1. 饿汉式(静态常量): 这种实现方式在类加载时就完成了初始化,所以是线程安全的。代码如下: ```java public class Singleton { private static final ...

    C++实现单例模式(懒汉式)源码

    以下是一个简单的C++懒汉式单例模式实现: ```cpp class Singleton { private: static Singleton* instance; Singleton() {} // 私有构造函数,防止外部直接创建对象 ~Singleton() {} // 私有析构函数,防止外部...

    通过javascript实现一个单例模式.rar

    压缩包js文件是通过javascript实现的单例模式。单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。...因此,在使用单例模式时,请确保它是解决当前问题的最佳方案。

    为什么要使用PHP单例模式及应用实例.docx

    为了正确地实现单例模式,需要注意以下几点: 1. **私有静态实例变量**:通常需要一个私有的静态变量来保存单例的实例。 ```php private static $_instance = null; ``` 2. **私有构造函数和克隆函数**:为了...

Global site tag (gtag.js) - Google Analytics