單例模式屬于創(chuàng)建類型的一種常用的軟件設(shè)計(jì)模式,通過該模式的方法創(chuàng)建的類在當(dāng)前進(jìn)程中只有一個(gè)實(shí)例,其好處可以確保所有對象都訪問唯一實(shí)例,以及減少內(nèi)存開支和系統(tǒng)的性能開銷。
單例模式是設(shè)計(jì)模式中最簡單的形式之一。這一模式的目的是使得類的一個(gè)對象成為系統(tǒng)中的唯一實(shí)例。要實(shí)現(xiàn)這一點(diǎn),可以從客戶端對其進(jìn)行實(shí)例化開始。因此需要用一種只允許生成對象類的唯一實(shí)例的機(jī)制,“阻止”所有想要生成對象的訪問。使用工廠方法來限制實(shí)例化過程。這個(gè)方法應(yīng)該是靜態(tài)方法(類方法),因?yàn)樽岊惖膶?shí)例去生成另一個(gè)唯一實(shí)例毫無意義。
單例模式實(shí)現(xiàn)方式
通常單例模式在Java語言中,有兩種構(gòu)建方式:
-
懶漢式—線程不安全:最基礎(chǔ)的實(shí)現(xiàn)方式,線程上下文單例,不需要共享給所有線程,也不需要加synchronize之類的鎖,以提高性能。
-
懶漢式—線程安全:加上synchronize之類保證線程安全的基礎(chǔ)上的懶漢模式,相對性能很低,大部分時(shí)間并不需要同步
-
餓漢方式。指全局的單例實(shí)例在類裝載時(shí)構(gòu)建。
-
雙檢鎖式。在懶漢式基礎(chǔ)上利用synchronize關(guān)鍵字和volatile關(guān)鍵字確保第一次創(chuàng)建時(shí)沒有線程間競爭而產(chǎn)生多個(gè)實(shí)例,僅第一次創(chuàng)建時(shí)同步,性能相對較高
-
登記式。作為創(chuàng)建類的全局屬性存在,創(chuàng)建類被裝載時(shí)創(chuàng)建
-
枚舉。java中枚舉類本身也是一種單例模式
推薦教程:《PHP》