設計模式 單例模式的終極目標就是要做你的唯一!

2022-09-09 12:15:22 字數 2923 閱讀 6473

單例模式就是嚴格控制乙個類的例項,要求在乙個程序或乙個執行緒中只存在乙個例項,如果沒有就建立乙個例項返回,如果有就返回已經已經存在的例項。不同的單例模式都是為了確保只有乙個例項

暫時想不到

單例類在乙個程序或執行緒中只能存在乙個例項

單例類的構造器必須私有化。不允許其它類來建立單例類,只有它自己能夠建立自己。

單例類需要向其它類提供獲取例項的方法,一般是靜態的。

減少了記憶體的開銷。因為單例模式要做是嚴格控制只能存在乙個例項,這樣就會極大地減少例項反覆建立時帶來的記憶體開銷

更加容易管理和維護。沒什麼好說的,全部內容都寫在這個類裡,只需要修改這個類就行了。

擴充套件性不強。單例模式只專注於只有能存在乙個例項,這就犧牲了它的擴充套件性。

與單一職責衝突。因為所有方法都要封裝在單例類中,所以會越來越龐大,職責也會越來越不清晰。

就像餓漢遇到美食一樣,一下子就全部吃完。

餓漢式單例,就是在裝載.class檔案是就會在靜態區生成乙個例項,其它類都是呼叫這個類。

package singletion;

/** * @author xxj

* 餓漢單例

*/public

class

hungrysingletion

public

static hungrysingletion getinstance()

}

餓漢式就是簡單粗暴,一上來就在靜態區生成乙個例項保證了執行緒安全,不會產生多餘的例項,但是建立的例項會導致初始化比較緩慢。下一種單例模式就是解決了這個問題。

懶漢嘛就是懶,不到火燒眉毛的時候絕對不會去做事情。

懶漢式單例,就是只在呼叫向其它類提供獲取例項的方法時,才會去生成例項,但是這樣就會存在一些執行緒問題。

**

package singletion;

/** * @author xxj

* 懶漢式單例

*/public

class

lazysingleton

public

static lazysingleton getinstance()

}

特點**
package singletion;

/** * @author xxj

* 雙重檢查懶漢式單例

*/public

class

doublechecklazysingleton}}

return instance;

}private

doublechecklazysingleton()

}

雙重檢查

簡單點說,第一次檢查是為了提高效率,畢竟並不是所有執行緒都能轉這個空子,這一道檢查,就可以攔截大部分的執行緒了;第二次檢查才是真正地解決執行緒安全問題,這裡加上了synchronized關鍵字,通過加鎖的方式,就可以解決多執行緒問題了。

特點繼承了簡單-懶漢式單例的延遲載入的特點,也解決了執行緒安全問題,唯一的缺點就是結構複雜了。

還有一種懶漢式單例模式,就是比雙重檢查-懶漢式單例少第二次檢查,那種單例能解決少量執行緒的執行緒安全問題,執行緒數多了,就不能保證了。

下面是兩種不常用的單例模式。

public

class

singleton

private singleton (

)public

static

final singleton getinstance()

}

這種使用靜態內部類實現的單例模式,其實是餓漢式的公升級版,首先是在單例類的內部建立了乙個靜態內部類,內部類裡面有乙個單例類的例項然後單例類給其它類提供乙個獲取例項的方法

當其它類呼叫這個方法時,類載入器才會去裝載內部類,一裝載,就會生成乙個單例類的例項

不僅繼承了餓漢式的執行緒安全的特性,而且實現了延遲載入的功能。

package singletion;

/** * @author xxj

* 列舉類單例模式

*/public

enum enumsingleton

}

首先即使實現簡單方便,用列舉類實現單例實際上和餓漢式是一樣的,它可以保證執行緒安全,但是同樣初始化比較緩慢

再說一點,列舉類的確可以實現單例化,我驗證過hashcode,都是一樣的,但是它的寫法就有點讓人摸不著頭腦。

一般情況下,使用餓漢式和列舉類實現就可以了,如果要考慮延遲載入的話,就使用簡單-懶漢式,再要考慮執行緒安全問題,就加個雙重檢查,或者直接使用靜態內部類實現。

人類的終極目標是什麼?

終極目標,就是該目標是最重要的,且不從屬與其他目標,它是頂級目標 相反,其他目標都最終是為實現終極目標服務的。人類的終極目標是生存,人類至今為止所有的活動大體上都是為了生存這個目標在服務。生存包含了 個體存在與物種延續 終極目標的副產品是自我實現,自我價值體現,受尊重 擁有成就 名氣 社會地位 社交...

谷歌的終極目標「人工智慧」

服務還沒有為谷歌創造太多營收,但它們絕對不是錦上添花的業務。卡爾認為,這些網路應用代表著根本性的變革,意味著從桌面到網路的巨大轉變,未來將重新定義計算和谷歌的業務模式。為了讓人們更容易理解這場變革,卡爾特別舉了乙個類似的例子 電力的發展。他認為,真正的電力創新並不是湯姆斯 愛迪生 thomas ed...

程式設計師的終極目標就是乾掉程式設計師

做了4年的碼農了,每天對著電腦就是寫 沒事也會思考下,算是悟 道 吧。物件導向 都是為了一句話 重複的 不要寫第二次。我基本上不會copy and paste,因為每次操作都有一種負罪感,感覺 沒寫好,對不起自己的水平,雖然我水平一般,但總以為自己比一般人強,也算是一種激勵吧。自尊產生的驅動力總能自...