單例模式的定義:
- 數學與邏輯學中,singleton定義為“有且僅有一個元素的集合”。
- 單例模式最初的定義出現于《設計模式》(艾迪生維斯理, 1994):“保證一個類僅有一個實體,并提供一個訪問它的全域訪問點。”
- Java中單例模式定義:“一個類有且僅有一個實體,并且自行實體化向整個系統提供。”
Java單例模式例子
public class Singleton {
private Singleton(){
}
private static volatile Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
通常單例模式在Java語言中,有兩種構建方式:
懶漢式—執行緒不安全:最基礎的實作方式,執行緒背景關系單例,不需要共享給所有執行緒,也不需要加synchronize之類的鎖,以提高性能。
懶漢式—執行緒安全:加上synchronize之類保證執行緒安全的基礎上的懶漢模式,相對性能很低,大部分時間并不需要同步
餓漢方式。指全域的單例實體在類裝載時構建。 [2]
雙檢鎖式。在懶漢式基礎上利用synchronize關鍵字和volatile關鍵字確保第一次創建時沒有執行緒間競爭而產生多個實體,僅第一次創建時同步,性能相對較高
登記式。作為創建類的全域屬性存在,創建類被裝載時創建
列舉。java中列舉類本身也是一種單例模式
單例模式的優缺點:
優點
一、實體控制
單例模式會阻止其他物件實體化其自己的單例物件的副本,從而確保所有物件都訪問唯一實體。
二、靈活性
因為類控制了實體化程序,所以類可以靈活更改實體化程序。
缺點
一、開銷
雖然數量很少,但如果每次物件請求參考時都要檢查是否存在類的實體,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。
二、可能的開發混淆
使用單例物件(尤其在類別庫中定義的物件)時,開發人員必須記住自己不能使用new關鍵字實體化物件。因為可能無法訪問庫源代碼,因此應用程式開發人員可能會意外發現自己無法直接實體化此類。
三、物件生存期
不能解決洗掉單個物件的問題。在提供記憶體管理的語言中(例如基于.NET Framework的語言),只有單例類能夠導致實體被取消分配,因為它包含對該實體的私有參考。在某些語言中(如 C++),其他類可以洗掉物件實體,但這樣會導致單例類中出現懸浮參考
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/27832.html
標籤:非技術區
