假設有這樣一個場景,如果復制的目標對象恰好是單例對象,那會不會破壞單例對象呢?
當然,我們在已知的情況下肯定不會這么干,但如果發生了意外怎么辦?不防來修改一下代碼。
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;
}