設計模式之單例模式

2021-08-19 23:56:43 字數 2879 閱讀 3612

單例模式是一種常見的設計模式,寫法也比較多,在這篇文章裡面主要是對單例模式的各種寫法進行乙個介紹。

首先簡單的介紹一下單例模式的使用場景

然後就是單例模式寫法的介紹。

最後對單例模式進行乙個總結

一、單例模式的介紹

比較官方的理解:

單例模式確保某個類只有乙個例項。在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。

有乙個通俗的理解,那就是在古代,全國就乙個皇帝。如何確保乙個皇帝?這就是單例模式。

二、單例模式的各種寫法

1、懶漢式:基本寫法

public class singleton //構造方法

private static singleton single=null;

public static singleton getinstance()  

return single;

}}

特點:

2、懶漢式:使用synchronized 同步

public class singleton  

public static synchronized singleton getinstance()  

return instance;  

}  }

特點:

3、懶漢式:雙重檢查鎖定

public class singleton 

public static singleton getinstance()  

}  }  

return singleton;

}}

特點:

4、餓漢式:基本寫法(instance為private)

public class singleton 

//提前建立乙個singleton

private static final singleton instance = new singleton();

//有呼叫者直接就拿出來給了

public static singleton getinstance()

}

特點:

5、餓漢式:基本寫法(instance為public)

public class singleton 

}

特點:

6、餓漢式:靜態**塊

public class singleton 

// 初始化順序:基靜態、子靜態 -> 基例項**塊、基構造 -> 子例項**塊、子構造

static

​    public static singleton getinstance()

}

特點:

7、靜態內部類

public class singleton   

private singleton (){}  

public static final singleton getinstance()  

}

特點:

8、列舉式

public enum singleton 

}

特點:

9、cas方式

public class singleton 

​   public static singleton getinstance()

instance = new singleton();

// cas 方法有兩個引數 expect 和 update,以原子方式實現了比較並設定的功能

// 如果當前值等於 expect,則更新為 update 並返回 true;否則不更新並返回 false

if(instance.compareandset(null, instance)) }}

}

特點:

10、lock機制

// 類似雙重校驗鎖寫法

public class singleton

​       public static singleton getinstance()

lock.unlock(); // 顯式呼叫,手動解鎖

}return instance;

}}

當然還有一些其他的實現單例的寫法,比如說登記式單例等等。

三、總結

單例模式

是否推薦

懶載入反序列化單例

反射單例

轉殖單例

效能、失效問題

餓漢模式推薦✘

✘✘✘懶漢模式✘✔️

✘✘✘存在效能問題

列舉推薦✔️

✔️✔️

✔️靜態內部類

推薦✔️✘✘

✘jdk < 1.5不支援

雙重校驗鎖

可用✔️✘✘

✘jdk < 1.5 失效

有兩種場景可能導致非單例的情況

單例的寫法基本上就是這些,可能在不同的場景下使用不同的方式,對我來說,在後端更經常使用的就是列舉型別,但是android開發當中很少使用。

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...