Singleton模式指出,一个类可以有一个实例,并且不允许创建多个实例。为此,我们将类的构造函数设为私有,并通过静态方法返回实例。但是使用克隆,我们仍然可以创建一个类的多个实例。请参阅下面的示例-
public class Tester{ public static void main(String[] args) throws CloneNotSupportedException { A a = A.getInstance(); A b = (A)a.clone(); System.out.println(a.hashCode()); System.out.println(b.hashCode()); } } class A implements Cloneable { private static A a; private A(){} public static A getInstance(){ if(a == null){ a = new A(); } return a; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
输出结果
705927765 366712642
在这里您可以看到,我们已经创建了Singleton类的另一个对象。让我们看看如何防止这种情况-
同样在clone方法中返回相同的对象。
@Override protected Object clone() throws CloneNotSupportedException { return getInstance(); }
输出结果
705927765 705927765