日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

原型模式coding-克隆破坏单例

發布時間:2024/4/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原型模式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-克隆破坏单例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。