android開發常用的設計模式 安卓中的設計模式



文章插圖
android開發常用的設計模式 安卓中的設計模式

文章插圖
1. 定義:
確保1個類只有1個實例化對象  , 提供一個全局訪問點
2. 優缺點
優點:客戶端使用單例模式的實例的時候 , 只需要調用一個單一的方法即可生成一個唯一的實例 , 有利于節約資源 。缺點:首先單例模式很難實現序列化 , 這就導致采用單例模式的類很難被持久化 , 當然也很難通過網絡傳輸;其次由于單例采用靜態方法 , 無法在繼承結構中使用 。
3. android源碼中的體現:
例如 , 加載布局時經常要創建LayoutInflater的實例 , 常見的有三種方法:
其實前兩種最后都是調用的最后一種 , 是獲取系統服務經常用到的方法 , 這只是一個典型的單例的使用場景 , 其實在Android源碼中用到單例的情況還有很多 。
4. 幾種實現方式
1.餓漢式:在聲明變量時就創建該實例優點:線程安全 , 多線程中使用不會出現創建多個實例的情況缺點:比較消耗計算機資源
2.懶漢式:使用到時才創建實例優點:節省計算機資源 , 在單線程下能夠非常好的工作缺點:在多線程下存在線程安全問題
懶漢式
3.懶漢式+雙重校驗鎖:DCL ( Double Check Lock)優點:既解決了”懶漢式“的多線程問題 , 又解決了資源浪費的現象 。缺點:在某些情況DCL會出現失效問題 , 《Java并發編程實踐》中提到此問題 , 并指出這種優化是丑陋的 , 不贊成使用的 , 而推薦使用靜態內部類實現 。DCL失效的原因:線程有可能得到一個不為null , 但是構造不完全的對象 。Why?造成不可靠的原因是編譯器為了提高執行效率的指令重排 。只要認為在單線程下是沒問題的 , 它就可以進行亂序寫入 , 以保證不要讓cpu指令流水線中斷 。
懶漢式+雙重校驗鎖
4.通過靜態內部類實現單例原理:一個類直到被使用時才被初始化 , 而類初始化的過程是非并行的 , 這些都有 JLS 保證這也是我自己最常用的單例寫法
靜態內部類實現單例
5.枚舉單例:寫法簡單,線程安全,并且保證任何情況都是單例上面的其他實現單例方法在反序列化(提供了一個特別的鉤子函數)時會創建新的單例 , 解決方法是如3中實現readResolve方法返回單例對象 , 而枚舉單例則不存在此問題 。
枚舉單例
【android開發常用的設計模式 安卓中的設計模式】6.使用容器實現單例:可以管理多種類型的單例