原型模式對(duì)單例模式的破壞
- 利用反射調(diào)用單例類的 clone() 方法,獲得單例類的多個(gè)實(shí)例;
public class HungrySingleton implements Cloneable{
private final static HungrySingleton hungrySingleton;
static {
hungrySingleton = new HungrySingleton();
}
private HungrySingleton() {}
public static HungrySingleton getInstance() {
return hungrySingleton;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Test {
public static void main(String[] args) throws Exception{
HungrySingleton hungrySingleton = HungrySingleton.getInstance();
Method method = HungrySingleton.class.getDeclaredMethod("clone");
method.setAccessible(true);
HungrySingleton cloneHungrSingleton = (HungrySingleton)method.invoke(hungrySingleton);
System.out.println(hungrySingleton);
System.out.println(cloneHungrSingleton);
System.out.println(hungrySingleton == cloneHungrSingleton);
}
}
輸出:
designpattern.creational.prototype.singletonattack.HungrySingleton@5b6f7412
designpattern.creational.prototype.singletonattack.HungrySingleton@27973e9b
false
解決方案
- 在 clone() 方法中直接調(diào)用 getInstance() 方法;
public class HungrySingleton implements Cloneable{
private final static HungrySingleton hungrySingleton;
static {
hungrySingleton = new HungrySingleton();
}
private HungrySingleton() {}
public static HungrySingleton getInstance() {
return hungrySingleton;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return getInstance();
}
}
public class Test {
public static void main(String[] args) throws Exception{
HungrySingleton hungrySingleton = HungrySingleton.getInstance();
Method method = HungrySingleton.class.getDeclaredMethod("clone");
method.setAccessible(true);
HungrySingleton cloneHungrSingleton = (HungrySingleton)method.invoke(hungrySingleton);
System.out.println(hungrySingleton);
System.out.println(cloneHungrSingleton);
System.out.println(hungrySingleton == cloneHungrSingleton);
}
}
輸出:
designpattern.creational.prototype.singletonattack.HungrySingleton@5b6f7412
designpattern.creational.prototype.singletonattack.HungrySingleton@5b6f7412
true