職責型模式 單例模式(Singleton)

2021-06-28 05:27:36 字數 1287 閱讀 3776

通常,物件通過在自身屬性上執行任務來承擔自己的職責,除了需要維護自身的一致性外,無須承擔其他任何職責。然而,仍有一些物件承擔了更多的職責,例如對真實世界的實體進行建模、協調工作或者對整個系統的狀態進行建模。當系統的其他物件都依賴於特殊物件所承擔的職責是,我們需要通過某種方式找到這個承擔職責的物件。例如,可能需要找到乙個代表指定機器的物件,或者是從資料庫獲取資料來建立自身的客戶物件,又或者是初始化系統記憶體用以恢復的物件。

在某些場景,你需要找到乙個承擔職責的物件,並且這個物件是它所屬類的唯一例項。

單例模式的英文為singleton。單例模式的意圖是為了確保乙個類有且僅有乙個例項,並為它提供乙個全域性訪問點。

單例模式機制

單例模式的機制比其意圖更加容易記憶。解釋如何保證乙個類有且僅有乙個例項,要比解釋為何需要這種限制要簡單的多。

建立乙個擔當著獨一無二角色的物件,有多種方式。但是,不管你如何建立乙個單例物件,都必須確保其他開發人員不能建立該單例物件的新的例項。

設計乙個單例類時,需要確定何時例項化該類的單例物件。一種做法是建立這個類的例項,並將它作為該類的靜態成員變數。例如,common/inject的dependencymanager類包含這一行:

private static dependencymanager instance;
這個類通過乙個公共的getinstance()靜態方法獲得該類的唯一例項。

如果不希望提前建立單例例項,還可以在第一次需要該例項時,延遲初始化它。例如,dependencymanager類採用如下方式獲取單個例項:

public static dependencymanager getinstance() 

return instance;

}

無論哪種場景,單例模式都建議提供乙個公共的靜態方法去訪問單例物件。如果該方法建立了乙個物件,它就要保證只有乙個例項可以被建立。

單例和執行緒

識別單例

這種獨一無二的物件並不罕見。事實上,因公程旭紅的很多物件都承擔了唯一的職責,既然如此,為何要建立擁有相同職責的兩個物件?同樣的,幾乎每個類都擁有獨一無二的角色,又何必為相同的類重複開發兩次?然而,允許類只能擁有乙個例項的單例類卻極為罕見。事實上,乙個物件或乙個類是唯一的,並不意味著就是單例模式。

小結單例模式保證了類僅有乙個例項,並為其提供了乙個全域性訪問點。通過延遲初始化(僅在第一次使用它時才初始化),乙個單例物件是達到此目的的通用做法。

物件具有唯一性,並不意味著使用了單例模式。單例模式通過隱藏建構函式,提供物件建立的唯一入口點,從而將類的職責集中在類的單個例項中。



Java設計模式 單例模式(single)

目錄目的 應用例項 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。菜鳥教程 乙個國家有乙個首都 windows 是多程序多執行緒的,在操作乙個檔案的時候,就不可避免地出現多個程序或執行緒同時操作乙個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。第一種 package com.ga...

建立型模式 單例模式

餓漢式 package com.hfview.designmode.signle 1.餓漢式 就是在初始化成員變數的時候就獲取例項物件 2.public class signlemode private signlemode 懶漢式 package com.hfview.designmode.sig...

建立型模式 單例模式

概述 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。適用性 當類只能有乙個事例而且客戶可以從乙個眾所周知的訪問點訪問它時。當這個唯一事例應該是通過子類化可擴充套件的,並且客戶應該無需更改 就能使用乙個擴充套件的例項時。參與者 singleton 定義乙個instance操作,允許客戶訪問它...