設計模式之一 單例模式

2021-08-19 09:57:54 字數 2035 閱讀 9908

一. 什麼是單例模式

某個類同時保留乙個物件,不希望有更多物件,此時,我們則應考慮單例模式的設計。

二. 單例模式的特點

1. 單例模式只能有乙個例項。

2. 單例類必須建立自己的唯一例項。

3. 單例類必須向其他物件提供這一例項。

三. 單例模式vs靜態類

在知道了什麼是單例模式後,我想你一定會想到靜態類,「既然只使用乙個物件,為何不乾脆使用靜態類?」,這裡我會將單例模式和靜態類進行乙個比較。

1. 單例可以繼承和被繼承,方法可以被override,而靜態方法不可以。

2. 靜態方法中產生的物件會在執行後被釋放,進而被gc清理,不會一直存在於記憶體中。

3. 靜態類會在第一次執行時初始化,單例模式可以有其他的選擇,即可以延遲載入。

4. 基於2, 3條,由於單例物件往往存在於dao層(例如sessionfactory),如果反覆的初始化和釋放,則會占用很多資源,而使用單例模式將其常駐於記憶體可以更加節約資源。

5. 靜態方法有更高的訪問效率。

幾個關於靜態類的誤解:

誤解一:靜態方法常駐記憶體而例項方法不是。

實際上,特殊編寫的例項方法可以常駐記憶體,而靜態方法需要不斷初始化和釋放。

誤解二:靜態方法在堆(heap)上,例項方法在棧(stack)上。

實際上,都是載入到特殊的不可寫的**記憶體區域中。

靜態類和單例模式情景的選擇:

情景一:不需要維持任何狀態,僅僅用於全域性訪問,此時更適合使用靜態類。

情景二:需要維持一些特定的狀態,此時更適合使用單例模式。

四. 單例模式的實現

1. 懶漢模式

如果乙個類建立例項需要呼叫較多的資源和較長的業務流程,那麼這裡所要建立的類就可以使用單例模式,按需供給,有效避免資源損耗。

public class singletondemo

public static singletondemo getinstance()

return instance;

}如上,通過提供乙個靜態的物件instance,利用private許可權的構造方法和getinstance()方法來給予訪問者乙個單例。

缺點是,沒有考慮到執行緒安全,可能存在多個訪問者同時訪問,並同時構造了多個物件的問題。之所以叫做懶漢模式,主要是因為此種方法可以非常明顯的lazy loading。

針對懶漢模式執行緒不安全的問題,我們自然想到了,在getinstance()方法前加鎖,於是就有了第二種實現。

2. 執行緒安全的懶漢模式

public class singletondemo

public static synchronized singletondemo getinstance()

return instance;

}3. 餓漢模式

public class singletondemo

public static singletondemo getinstance()

}直接在執行這個類的時候進行一次loading,之後直接訪問。顯然,這種方法沒有起到lazy loading的效果,考慮到前面提到的和靜態類的對比,這種方法只比靜態類多了乙個記憶體常駐而已。

單例是為了保證系統中只有乙個例項,其關鍵點有5

一.私有建構函式

二.宣告靜態單例物件

三.構造單例物件之前要加鎖(lock乙個靜態的object物件)

四.需要兩次檢測單例例項是否已經被構造,分別在鎖之前和鎖之後

0.為何要檢測兩次?

如上面所述,有可能延遲載入或者快取原因,造成構造多個例項,違反了單例的初衷。

1.建構函式能否公有化?

不行,單例類的建構函式必須私有化,單例類不能被例項化,單例例項只能靜態呼叫

2.lock住的物件為什麼要是object物件,可以是int嗎?

不行,鎖住的必須是個引用型別。如果鎖值型別,每個不同的執行緒在宣告的時候值型別變數的位址都不一樣,那麼上個執行緒鎖住的東西下個執行緒進來會認為根本沒鎖,相當於每次都鎖了不同的門,沒有任何卵用。而引用型別的變數位址是相同的,每個執行緒進來判斷鎖多想是否被鎖的時候都是判斷同乙個位址,相當於是鎖在通一扇門,起到了鎖的作用。

設計模式之一單例模式

單例模式就是類別只有乙個例項,每次在必得類呼叫這個類的例項,都是同乙個例項。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。如印表機 顯示卡等等這些系統資源。如果做andr...

設計模式之一 單例模式

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項。定義乙個單例類,使用類的私有指標變數指向類的唯一例項,並且使用乙個共有的靜態方法獲取該例項。懶漢模式 即第一次呼叫該類的例項的時候才產生乙個新的該...

設計模式之一 單例模式

好久不寫部落格,最近都在複習,心血來潮,寫一篇關於設計模式 單例模式的部落格。我們知道,對於c oop思想,我們怎麼可以說不熟悉設計模式,接下來就簡單地介紹一下單例模式。在我們的設計當中經常要保證系統中,應用該模式的類乙個類只有乙個例項。即乙個類只有乙個物件例項。思考一下,什麼時候建構函式不能手動呼...