有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

共 (2) 个答案

  1. # 1 楼答案

    单例模式不是JVM提供的。JVM对单例一无所知,开发人员希望它只出现一次。它只是一种模式,没有内置的JVM特性

    当然,也有复制单例的方法,例如,使用ReflectionAPI。没有什么能阻止开发人员克隆您的单例(in case it's not an enum

    正如您所发布的,也可以使用clone()。在您的示例中,您确实生成了两个不同的对象。然而,为了防止克隆,重写clone()并抛出CloneNotSupportedException是或多或少的常见做法

  2. # 2 楼答案

    当您使您的单例克隆成为可克隆时,问题就会出现:

    public class LazySingleton implements Cloneable
    

    没有理由对单例执行此操作,因为根据定义,单例只有一个实例

    不要实现Cloneable,那么它就不能被克隆(至少通过调用clone()