設計模式之單例模式

2021-10-18 12:55:02 字數 2288 閱讀 6144

單例模式是指我們通過一種方式來使整個軟體在使用過程中,某個類只能出現乙個物件例項,並且只有乙個方法可以去獲取該物件例項。

單例模式保證了 系統記憶體中該類只存在乙個物件,節省了系統資源,對於一些需要頻繁建立銷毀的物件,使用單例模式可以提高系統效能

當想例項化乙個單例類的時候,必須要記住使用相應的獲取物件的方法,而不是使用 new

單例模式使用的場景:需要頻繁的進行建立和銷毀的物件、建立物件時耗時過多或耗費資源過多(即:重量級物件),但又經常用到的物件、工具類物件、頻繁訪問資料庫或檔案的物件。

讓我們一同來看他的幾種方式:

餓漢式是指在程式啟動的時候,已經提前建立好該類的物件,並且建立了乙個方法去獲取該物件:

class

hungerperson

//類內部建立乙個例項物件

private

final

static hungerperson hungerperson =

newhungerperson()

;//將類中建立乙個公有方法,獲取該物件

public

static hungerperson gethungerperson()

}

呼叫方式的話:

public

class

singleton

}

優點:在類裝載的時候就完成例項化,避免了執行緒同步問題,**編寫也比較簡單。

缺點:在類裝載的時候就完成例項化,如果從始至終從未使用過這個例項,則會造成記憶體的浪費。

這個實際上是在第一次需要的時候才去建立物件,如果物件存在則直接呼叫。

class

lazyperson

private

static lazyperson lazyperson;

public

static lazyperson getlazyperson()

return lazyperson;

}}

但是聰明的小夥伴就會發現問題了,這個並不能徹底的實現單例模式,因為在多執行緒的情況下,我們並沒有對這個建立函式上鎖,他有可能會在不同的執行緒下被建立…所以我們加上執行緒鎖:

class

lazyperson

private

static lazyperson lazyperson;

public

static

synchronized lazyperson getlazyperson()

return lazyperson;

}}

這種方法似乎已經可以使我們滿足所有情況下都只有乙個物件了,但是我們還會發現新的問題,這個**效率太低了,因為在建立了乙個物件之後,剩下的情況我們似乎完全不需要建立物件了,僅僅通過該方法new物件就可以了,於是乎我們引入同步**塊:

class

lazyperson

private

static lazyperson lazyperson;

public

static lazyperson getlazyperson()

}}return lazyperson;

}}

注意此處我們比較了兩次,lazyperson是不是為空,原因在於第一次比較我們在多執行緒狀態下可能並不準確(多個執行緒同時判斷為空並想要強鎖)此判斷的主要作用在於區分第一建立物件和後續的呼叫物件,第二個判斷是多個執行緒都進入該外條件後,如果有乙個搶到了鎖並且建立完後,其餘進入的執行緒不用在建立該物件了,而是退出返回該物件就可以。

呼叫方法:

lazyperson l = lazyperson.

getlazyperson()

;

優點:延遲載入,不會在從頭到尾不使用時增加記憶體消耗,效率較高,執行緒安全。

缺點:**不好寫…

class

staticclass

private

static

class

instance

public

static

synchronized staticclass getstaticclass()

}

類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm 幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的。

優點:避免了執行緒不安全,利用靜態內部類特點實現延遲載入,效率高

博主也就這麼點能力了…

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...