java设计模式特例
在单例设计模式中,如果我创建单例类对象的克隆,并打印这两个对象,我将得到两个不同的输出,但构造函数只被调用一次。我很困惑,是单例设计模式在这种情况下失败了,还是仅仅是一种幻觉
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
# 1 楼答案
单例模式不是JVM提供的。JVM对单例一无所知,开发人员希望它只出现一次。它只是一种模式,没有内置的JVM特性
当然,也有复制单例的方法,例如,使用
Reflection
API。没有什么能阻止开发人员克隆您的单例(in case it's not an enum)正如您所发布的,也可以使用
clone()
。在您的示例中,您确实生成了两个不同的对象。然而,为了防止克隆,重写clone()
并抛出CloneNotSupportedException
是或多或少的常见做法# 2 楼答案
当您使您的单例克隆成为可克隆时,问题就会出现:
没有理由对单例执行此操作,因为根据定义,单例只有一个实例
不要实现
Cloneable
,那么它就不能被克隆(至少通过调用clone()
)