連載文章
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容器實現的單例模式。如果是想直接找一個單例模式使用的話,那就直接複製程式碼就好。如果想知道他們的優缺點的話,就可以看下注釋。還是那句話風裡雨裡在這裡等你,您的一個贊或者收藏就是我寫下去的動力,希望大家共同進步。如有錯誤請及時提出我也好改正。 另附GitHub原始碼地址:https://github.com/13046434521/DesignPatterns