Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设计模式特例_Java_Design Patterns - Fatal编程技术网

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