Java 设计模式特例
在单例设计模式中,如果我创建单例类对象的克隆,并打印这两个对象,我将得到两个不同的输出,但构造函数只被调用一次。我很困惑,是单例设计模式在这种情况下失败了,还是仅仅是一种幻觉Java 设计模式特例,java,design-patterns,Java,Design Patterns,在单例设计模式中,如果我创建单例类对象的克隆,并打印这两个对象,我将得到两个不同的输出,但构造函数只被调用一次。我很困惑,是单例设计模式在这种情况下失败了,还是仅仅是一种幻觉 public class LazySingleton implements Cloneable{ private static LazySingleton lazy; private static int counter=0; private LazySingleton() { S
public class LazySingleton implements Cloneable{
private static LazySingleton lazy;
private static int counter=0;
private LazySingleton() {
System.out.println(counter++);
}
public synchronized static LazySingleton getObject(){
if(lazy==null)
lazy=new LazySingleton();
return lazy;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public class DriverClone {
public static void main(String[] args) throws CloneNotSupportedException {
LazySingleton obj=LazySingleton.getObject();
System.out.println(obj);
System.out.println(obj.clone());
}
}
输出
0
LazySingletonDesignPattern.LazySingleton@157ee3e5
LazySingletonDesignPattern.LazySingleton@3da3da69
单例模式不是JVM提供的。JVM对单例一无所知,开发人员希望它只出现一次。它只是一种模式,没有内置的JVM特性 当然,也有复制单例的方法,例如,使用
Reflection
API。没有什么能阻止开发人员克隆您的Singleton()
正如您所发布的,也可以使用
clone()
。在您的示例中,您确实生成了两个不同的对象。但是,为了防止克隆,通常的做法是重写clone()
并抛出CloneNotSupportedException
使单例克隆成为可克隆的问题:
没有理由对单例执行此操作,因为根据定义,单例只有一个实例
不要实现Cloneable
,那么它就不能被克隆(至少通过调用clone()
)
public class LazySingleton implements Cloneable