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

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

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

    單例模式的英文爲Singleton。單例模式的意圖是爲了確保一個類有且僅有一個實例,併爲它提供一個全局訪問點。

    單例模式機制

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

        創建一個擔當着獨一無二角色的對象,有多種方式。但是,不管你如何創建一個單例對象,都必須確保其他開發人員不能創建該單例對象的新的實例。

        設計一個單例類時,需要確定何時實例化該類的單例對象。一種做法是創建這個類的實例,並將它作爲該類的靜態成員變量。例如,common/inject的DependencyManager類包含這一行:

	private static DependencyManager instance;

        這個類通過一個公共的getInstance()靜態方法獲得該類的唯一實例。

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

	public static DependencyManager getInstance() {
		if (instance == null) {
			instance = new DependencyManager();
		}
		return instance;
	}

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

    單例和線程

        ...

    識別單例

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

    小結

        單例模式保證了類僅有一個實例,併爲其提供了一個全局訪問點。通過延遲初始化(僅在第一次使用它時才初始化),一個單例對象是達到此目的的通用做法。

        對象具有唯一性,並不意味着使用了單例模式。單例模式通過隱藏構造函數,提供對象創建的唯一入口點,從而將類的職責集中在類的單個實例中。



發佈了33 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章