單例模式,今天你用了嘛
1.前言
提起設計模式,可能大家有些人會感覺陌生,有些人會覺得經常使用。其實說到設計模式,不用感到陌生與害怕,其實我們每天在不經意間都在或多或少的使用或者接觸設計模式。這篇文章就是想帶大家瞭解最基礎的設計模式,單例模式!
2.簡介
單例模式是指,有且只有一個該類的例項化物件,並且例項化過程由這個類自己實現。該類的建構函式是私有化的。
3.常見的幾種單例模式
餓漢式單例模式
/** * 作者:jtl * 日期:Created in 2019/1/25 15:48 * 描述:餓漢式單例模式 * 優點:1.空間換時間,每次都直接載入,節約了建立例項的時間 * 缺點:1.因為不管是否用到了該類,都會直接建立例項,所以在不使用的情況下,就浪費了空間 */ public class HungrySingleton { private static HungrySingleton sSingleton = new HungrySingleton(); private HungrySingleton(){} public static HungrySingleton getInstance(){ return sSingleton; } }
懶漢式單例模式
/** * 作者:jtl * 日期:Created in 2019/1/25 15:45 * 描述:懶漢式單例模式 * 優點:1.時間換空間,在呼叫的時候才建立例項,節約了空間 *2.每次getInstance的時候才建立例項,節約了資源 * * 缺點:1.每次在呼叫的時候才建立例項,有點浪費時間 *2.每次呼叫getInstance都需要執行緒同步,造成不必要的開銷 */ public class LazySingleton { private static LazySingleton sSingleton; private LazySingleton(){} public static synchronized LazySingleton getInstance(){ if (sSingleton==null){ sSingleton=new LazySingleton(); } return sSingleton; } }
DCL(Double Check Lock)單例模式
/** * 作者:jtl * 日期:Created in 2019/1/25 16:16 * 描述:DCL(Double Check Lock)單例模式 * 優點:1.在懶漢式的基礎上進行了判斷,只有在第一次建立例項的時候才會,進行執行緒同步操作。資源利用率高 * 缺點:1.高併發情況下會出現問題 *2.JDK1.5之前會出現問題。由於Java編譯器允許處理器亂序執行,JDK之前JMM中Cache暫存器到主記憶體回寫順序的規定,可能1-2-3,也可能1-3-2,所以可能JDK1.5之前出現問題 *(1)給DclSingleton分配記憶體 *(2)呼叫DclSingleton()的建構函式,初始化成員欄位; *(3)將mSingleton指向分配的記憶體空間(此時mSingleton不為null) */ public class DclSingleton { private static DclSingleton mSingleton=null; private DclSingleton(){} public static DclSingleton getInstance(){ if (mSingleton==null){ synchronized (DclSingleton.class){ if (mSingleton==null){ mSingleton=new DclSingleton(); } } } return mSingleton; } }
靜態內部類單例模式
/** * 作者:jtl * 日期:Created in 2019/1/25 16:14 * 描述:靜態內部類單例模式 * 優點:1.保證了執行緒安全問題,也能保證單例的唯一性(推薦) * 缺點: */ public class StaticSingleton { private StaticSingleton(){} private static StaticSingleton getInstance(){ return StaticSingletonHolder.sSingleton; } private static class StaticSingletonHolder{ private static final StaticSingleton sSingleton=new StaticSingleton(); } }
4.後續
上面例舉了幾種常見的單例模式,其中本人最為常用的是靜態內部類單例模式。當然這四種並不是所有的單例模式,還有列舉單例模式,以及使用Map容器實現的單例模式。如果是想直接找一個單例模式使用的話,那就直接複製程式碼就好。如果想知道他們的優缺點的話,就可以看下注釋。
還是那句話風裡雨裡在這裡等你,您的一個贊或者收藏就是我寫下去的動力,希望大家共同進步。如有錯誤請及時提出我也好改正。