設計模式之單例模式(單例模式的五種寫法)
熊大
單例模式是23種設計模式之一并且屬于創建型,
而且單例模式面試題經常出現 ,那么接下來讓我們看看單例模式得五種寫法,
第一種餓漢模式:
public class Singleton {
//關鍵字static 修飾類提前加載好
private static final Singleton instance = new Singleton();
//提供無參私有構造方法
private Singleton() {
}
public static Singleton instance(){
return instance;
}
}
類加載得時候就已經被創建好了所以在創建得程序是執行緒安全得,
也許有人認為這種并不好因為它不是延遲加載得會占用記憶體,
其實事物都是雙面性得如果是一個比較耗時得操作還是希望提前加載出來,
懶漢模式:
public class Singleton {
private static Singleton instance ;
//提供無參私有構造方法
private Singleton() {
}
public static synchronized Singleton getInstance(){
if (null==instance){
instance=new Singleton();
}
return instance;
}
}
懶漢模式顧名思義是實體在用到的時候才去創建,
懶漢模式: 每次獲取單例的時候加鎖如果頻繁使用會影響呼叫效率,
餓漢模式:初始化得時候加載會占用記憶體不支持延遲加載,
雙重校驗模式:
public class Singleton {
// 需要加上volatitle 防止指令重排
private static volatile Singleton instance;
private Singleton() { }
public static Singleton getInstance(){
//第一次校驗如果為空
if (null==instance){
//對整個類進行加鎖
synchronized (Singleton.class){
//初始化
instance=new Singleton();
}
}
return instance;
}
}
從代碼上看雙重校驗模式綜合了懶漢、餓漢得優點即支持延時加載也不占用記憶體,執行緒也是安全得性能大幅提升,
內部靜態類模式:
public class Singleton {
private Singleton() { }
// 內部靜態類
public static class SingletonHolder{
private static final Singleton instance=new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
SingletonHolder 是一個內部靜態類,當外部類 Singleton 被加載的時候,并不會創建 SingletonHolder 實體物件,只有當呼叫 getInstance() 方法時,SingletonHolder 才會被加載,這個時候才會創建 instance,instance 的唯一性、創建程序的執行緒安全性,都由 JVM 來保證,所以,這種實作方法既保證了執行緒安全,又能做到延遲加載,
列舉Enum:
public enum Singleton{
INSTANCE;
private void singleton(){
}
}
列舉型別本身的特性保證了實體創建的執行緒安全性和實體的唯一性,
對于列舉還有許多妙用如我們在開發得時候經常會遇到狀態的判斷,
如對于一筆訂單來說是成功、失敗、處理中各有不同的邏輯處理也許有的人會用if,也許有的人會用switch 其實用列舉也可以搞定如下,
@Slf4j
public enum Singleton{
SUCCESS {
@Override
public void doSomeThing() {
log.info("處理成功時得方法");
}
},
FAIL {
@Override
public void doSomeThing() {
log.info("處理失敗時得方法");
}
},
PROCESSING {
@Override
public void doSomeThing() {
log.info("處理中得方法");
}
};
// 多個實作 職責單一
public abstract void doSomeThing();
}
假如代碼這樣寫是不是就可以根據它回傳的狀態直接這樣寫Singleton.valueOf(status).doSomeThing這樣代碼是不是比較簡潔呢!
如有錯誤請添加微信指出或者評論指出
當然也尋找志同道合的同學一起進步下面是個人微信歡迎您的添加:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/252672.html
標籤:java
下一篇:Java8 Stream
