Java基礎(十六) 單例模式

2021-08-17 22:51:53 字數 1590 閱讀 5954

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類乙個類只有乙個例項。即乙個類只有乙個物件例項

保證全域性過程中只存在乙個唯一例項的模式

單例模式的要點有三個:一是某個類只能有乙個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。

優點:例項控制

:單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。

靈活性:

因為類控制了例項化過程,所以類可以靈活更改例項化過程。

缺點:開銷:雖然數量很少,但如果每次物件請求引用時都要檢查是否存在類的例項,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。

可能的開發混淆:使用單例物件(尤其在類庫中定義的物件)時,開發人員必須記住自己不能使用

new關鍵字例項化物件。因為可能無法訪問庫源**,因此應用程式開發人員可能會意外發現自己無法直接例項化此類。

物件生存期:不能解決刪除單個物件的問題。在提供記憶體管理的語言中(例如基於.net framework的語言),只有單例類能夠導致例項被取消分配,因為它包含對該例項的私有引用。在某些語言中(如 c++),其他類可以刪除物件例項,但這樣會導致單例類中出現懸浮引用

1.餓漢式單例(立即載入方式)

//

餓漢式單例

public

class

singleton1

private

static singleton1 single = new

singleton1();

//靜態工廠方法

public

static

singleton1 getinstance()

}

2.懶漢式單例(延遲載入方式)

//

懶漢式單例

public

class

singleton2

private

static singleton2 single = null

;public

static

singleton2 getinstance()

return

single;}}

該示例雖然用延遲載入方式實現了懶漢式單例,但在多執行緒環境下會產生多個single物件,如何改造請看以下方式:

使用synchronized同步鎖

public

class

singleton3

private

static singleton3 single = null

;

public

static

singleton3 getinstance()

}return

single;}}

在方法上加synchronized同步鎖或是用同步**塊對類加同步鎖,此種方式雖然解決了多個例項物件問題,但是該方式執行效率卻很低下,下乙個執行緒想要獲取物件,就必須等待上乙個執行緒釋放鎖之後,才可以繼續執行。

java基礎 單例模式

單例模式 singleton模式 乙個類有且僅有乙個例項,並且自行例項化向整個系統提供 公開 具體實現的角度來說 構造方法私有化 靜態屬性指向例項 public static的getinstance方法,返回第二部的靜態屬性 餓漢模式,無論如何都會建立乙個例項 例子取自 以lol中的大龍 giant...

單例模式(十六)

單例模式 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。通常我們可以讓乙個全域性變數使得乙個物件被訪問,但它不能防止你例項化多個物件。乙個最好的辦法就是,讓類自身負責儲存它的唯一例項。這個類可以保證沒有其它的例項可以建立,並且它可以提供乙個訪問該例項的方法。singleton類,定義乙個g...

Java基礎 設計模式 單例模式

單例模式,顧名思義,即只能建立乙個物件,是一種十分常見的設計模式。下面介紹一下兩種比較簡單的單例模式 1 餓漢式 不可以延時載入,類載入的時候就建立物件。如果沒有用到這個物件的話,就會導致資源浪費。2 懶漢式 可以延時載入,即用到物件的時候再new物件。但是必須考慮同步問題,如果不考慮,當多個執行緒...