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;
}
}
分享到:
相关推荐
下面将详细介绍七种常见的单例模式实现方式,并结合多线程环境和反序列化测试进行讨论。 1. **饿汉式单例**: 这是最简单的单例实现,它在类加载时就创建了实例,因此是线程安全的。 ```java public class ...
在给定的内容中提到的`Martin`类就是一个典型的单例模式实现案例。它通过将构造器私有化以及提供一个静态成员变量来确保了`Martin`类的唯一实例的存在。 ```java public class Martin { private Martin() { // ...
懒汉式单例模式则是在第一次调用 `getInstance()` 方法时才创建实例,实现了真正的按需创建。但由于多线程环境下可能出现多个实例,因此需要进行同步控制。 ```java public class Singleton { private static ...
总结来说,C++中的单例模式实现要考虑线程安全和生命周期管理,尤其是在多线程环境下。上述的三种方法分别适用于不同的场景,开发者应根据实际需求选择合适的方式。在实际编程中,还需注意防止内存泄漏,确保单例...
接下来,我们详细介绍六种不同的单例模式实现方法。 1. 饿汉式(Eager Initialization) 饿汉式是一种简单的单例实现方式。在类加载时,单例对象就已经创建。这种实现方式的优点是实现简单,但缺点是不管是否使用,...
经典的单例模式实现如以下示例所示: ```java public class ClassicSingleton { private static ClassicSingleton instance = null; protected ClassicSingleton() { // 存在仅为了防止实例化 } public ...
单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类在整个程序运行期间只有一个实例存在。...同时,理解并掌握单例模式的实现方式及其在特定环境下的注意事项,是每个Android开发者必备的知识。
### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...
在复杂的系统架构中,还需要考虑多线程、多类加载器、跨JVM等特殊场景下的单例模式实现。 通过本文的介绍,我们可以看到单例模式不仅限于一个简单的类实现,还可以根据不同的应用场景进行扩展和优化。在软件开发...
需要注意的是,单例模式可能会导致程序设计过于紧密耦合,不易于测试和扩展。因此,在使用单例时需谨慎,避免滥用。此外,如果需要依赖注入,可以考虑使用`Dependency Injection`框架来代替硬编码的单例。
本文将详细介绍几种常见的单例模式实现方式,并探讨它们在实际开发中的应用和最佳实践。 在实现单例模式时,应注意以下几点: 确保单例类不被继承,可以通过将构造函数设置为私有来实现。 考虑线程安全问题,选择...
以上就是Java中常见的单例模式实现方式,每种方式都有其适用场景和优缺点。在实际开发中,应根据项目需求和环境选择合适的方法。例如,如果对性能要求较高,可能会选择静态内部类或枚举方式;如果需要考虑序列化问题...
在Qt的Qml环境中,单例模式是一种设计模式,它允许在整个应用程序中创建一个全局访问点,确保某个类只有一个实例存在。这样的设计模式在需要共享数据或者服务时非常有用,避免了多处创建相同对象导致的数据不一致或...
在压缩包文件"课堂演示代码"中,可能包含了以上各种单例模式实现的示例代码,供学习者理解和实践。通过这些代码,你可以亲手运行并观察不同实现方式的效果,进一步理解单例模式的工作原理及其在Java中的应用。
在Java中,常见的单例模式实现方式有以下几种: 1. 饿汉式(静态常量): 这种实现方式在类加载时就完成了初始化,所以是线程安全的。代码如下: ```java public class Singleton { private static final ...
以下是一个简单的C++懒汉式单例模式实现: ```cpp class Singleton { private: static Singleton* instance; Singleton() {} // 私有构造函数,防止外部直接创建对象 ~Singleton() {} // 私有析构函数,防止外部...
压缩包js文件是通过javascript实现的单例模式。单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。...因此,在使用单例模式时,请确保它是解决当前问题的最佳方案。
为了正确地实现单例模式,需要注意以下几点: 1. **私有静态实例变量**:通常需要一个私有的静态变量来保存单例的实例。 ```php private static $_instance = null; ``` 2. **私有构造函数和克隆函数**:为了...