假设有这样一个场景,如果复制的目标对象恰好是单例对象,那会不会破坏单例对象呢?
当然,我们在已知的情况下肯定不会这么干,但如果发生了意外怎么办?不防来修改一下代码。
public class ConcretePrototype implements Cloneable {
private static ConcretePrototype instance = new ConcretePrototype();
private ConcretePrototype() {
}
public static ConcretePrototype getInstance() {
return instance;
}
@Override
public ConcretePrototype clone() {
try {
return (ConcretePrototype) super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
}
我们把构造方法私有化,并且提供 getInstance() 方法。编写客户端测试代码如下。
public static void main(String[] args) {
//创建原型对象
ConcretePrototype protoType = ConcretePrototype.getInstance();
//复制原型对象
ConcretePrototype cloneType = protoType.clone();
System.out.println("原型对象和克隆对象比较"+(protoType==cloneType));
}
运行结果如下所示:
原型对象和克隆对象比较false
从运行结果来看,确实创建了两个不同的对象。实际上防止复制破坏单例对象的解决思路非常简单,禁止复制便可。那么我们的单例类不实现 Cloneable 接口,要么我们重写 clone() 方法,在 clone() 方法中返回单例对象即可,具体代码如下。
@Override
public ConcretePrototype clone() {
return instance;
}