原型模式coding-克隆破坏单例
生活随笔
收集整理的這篇文章主要介紹了
原型模式coding-克隆破坏单例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我認為補這一段是非常有必要的,所以呢就給大家補了一下,對于原型模式的理解,我們想象一下,如果和單例結合起來應用的話,會怎么樣呢,那這個問題,也有可能會被問到,如何破壞單例模式,那通過原型模式的克隆呢,也是一種方法,那現在我們來操作一下,很簡單
package com.learn.design.pattern.creational.singleton;import java.io.Serializable;/*** 我們現在讓這個類實現Cloneable接口* * * @author Leon.Sun**/
public class HungrySingleton implements Serializable,Cloneable{private final static HungrySingleton hungrySingleton;static{hungrySingleton = new HungrySingleton();}private HungrySingleton(){if(hungrySingleton != null){throw new RuntimeException("單例構造器禁止反射調用");}}public static HungrySingleton getInstance(){return hungrySingleton;}private Object readResolve(){return hungrySingleton;}/*** 然后讓他重寫克隆方法* 注意克隆方法重寫之后* 它是protected* 這么一個權限* 那里面的實現先不動* 然后來到Test里邊* * * */@Overrideprotected Object clone() throws CloneNotSupportedException {return getInstance();}
}
package com.learn.design.pattern.creational.prototype.clone;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import com.learn.design.pattern.creational.singleton.HungrySingleton;/*** * @author Leon.Sun**/
public class Test {public static void main(String[] args) throws CloneNotSupportedException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
// Date birthday = new Date(0L);
// Pig pig1 = new Pig("佩奇",birthday);
// Pig pig2 = (Pig) pig1.clone();
// System.out.println(pig1);
// System.out.println(pig2);// pig1.getBirthday().setTime(666666666666L);// System.out.println(pig1);
// System.out.println(pig2);/*** 我們就用最簡單的單例* * */HungrySingleton hungrySingleton = HungrySingleton.getInstance();/*** 我們直接還用反射* 選擇反射包下的* hungrySingleton.getClass()獲取他的class* 然后獲取getDeclaredMethod("clone")* * */Method method = hungrySingleton.getClass().getDeclaredMethod("clone");/*** 然后我們來設置他的權限* 我們把他的權限打開* * */method.setAccessible(true);/*** 調用它的invoke* method.invoke* invoke哪個對象呢* 就是hungrySingleton這個對象* 參數沒有* 所以第二個參數就不加* 這里出現了一個強轉的報錯* 我們直接強轉他* 我們run一下* 非常簡單* 結果已經出來了* 我們看到這兩個對象并不是同一個對象* 那怎么解決呢* 很簡單* 要么我們這個單例不去實現cloneable接口* 或者如果實現了* 直接調用getInstance()方法* 我們再run一下* 結果已經出來了* 這兩個類是同一個對象* 所以呢學完原型模式的時候* 我們再回想一下* 單例模式* 那這些也都是想通的* 那如何防止克隆破壞呢* 只要我們不實現cloneable接口的話* 或者我們實現了他* 然后呢重寫* 重寫這個對象的實例* 這樣的話就不怕克隆破壞了* 那么回來* 希望通過這一段* 可以再回想一下* 對于破壞單例模式* 會有哪些方案呢* 另外就是設計模式和設計模式之間* 他們之間并不是獨立存在的* 我們學習完這個課程之后* 應該多思考* 融會貫通* 那在很多源碼中* 也不只單單使用一個設計模式* 也會把很多設計模式結合在一塊* 那我們在實際解決業務的時候呢* 也會碰到這樣的業務場景* 可能不僅僅使用一個設計模式* * * */HungrySingleton cloneHungrySingleton = (HungrySingleton) method.invoke(hungrySingleton);System.out.println(hungrySingleton);System.out.println(cloneHungrySingleton);}
}
?
總結
以上是生活随笔為你收集整理的原型模式coding-克隆破坏单例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原型模式codeing
- 下一篇: 原型模式源码解析