提起設計模式,可能你們有些人會感受陌生,有些人會以爲常用。其實說到設計模式,不用感到陌生與懼怕,其實咱們天天在不經意間都在或多或少的使用或者接觸設計模式。這篇文章就是想帶你們瞭解最基礎的設計模式,單例模式!git
單例模式是指,有且只有一個該類的實例化對象,而且實例化過程由這個類本身實現。該類的構造函數是私有化的。github
/**
* 做者: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;
}
}
複製代碼
/**
* 做者:jtl
* 日期:Created in 2019/1/25 16:16
* 描述:DCL(Double Check Lock)單例模式
* 優勢:1.在懶漢式的基礎上進行了判斷,只有在第一次建立實例的時候纔會,進行線程同步操做。資源利用率高
* 缺點:1.高併發狀況下會出現問題
* 2.JDK5以前會出現問題。因爲Java編譯器容許處理器亂序執行,JDK以前JMM中Cache寄存器到主內存回寫順序的規定,可能1-2-3,也可能1-3-2,因此可能JDK1.5以前出現問題
* (1)給DclSingleton分配內存
* (2)調用DclSingleton()的構造函數,初始化成員字段;
* (3)將mSingleton指向分配的內存空間(此時mSingleton不爲null)
* 3.在JDK5以後,Java使用了新的內存模型JSR-133,它加強了volatile的內存語義。使用volatile修飾的對象,不會出現(2)中出現的問題
*/
public class DclSingleton {
private static volatile 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();
}
}
複製代碼
上面例舉了幾種常見的單例模式,其中本人最爲經常使用的是靜態內部類單例模式。固然這四種並非全部的單例模式,還有枚舉單例模式,以及使用Map容器實現的單例模式。若是是想直接找一個單例模式使用的話,那就直接複製代碼就好。若是想知道他們的優缺點的話,就能夠看下注釋。仍是那句話風裏雨裏在這裏等你,您的一個贊或者收藏就是我寫下去的動力,但願你們共同進步。若有錯誤請及時提出我也好改正。 另附GitHub源碼地址:github.com/13046434521…設計模式