設計模式學習(三) 確保物件的唯一性 單例模式

2022-05-05 04:09:09 字數 2776 閱讀 4850

一、簡介

單例模式是用於建立那些在軟體系統中獨一無二的物件。

二、單例模式的意圖

在實際開發過程中經常遇見這樣的情況,為了節約系統資源,有時需要確保系統中某個類只有唯一乙個例項,當這個唯一例項建立成功之後,無法再建立乙個同型別的其他物件,所有的操作都只能基於這個唯一例項。例如,windows任務管理器在系統中有且僅有乙個。

三、單例模式概述

(1)概念

單例模式:確保某一類只有乙個例項,而且自行例項化並向整個系統提供這個例項,這個類成為單例類,它提供全域性訪問的方法。

(2)類圖

(3)核心**

1

public

class

singleton25

6//靜態變數

7private

static singleton instance = null

; 89//

公有的靜態方法返回該例項

10public

static

singleton getinstance()

1116

return

instance;

17}

18 }

說明:①為了確保singleton例項的唯一性,需要禁止類的外部直接使用new來建立物件,因此需要將singleton的建構函式的可見性改為private。

②為了讓外界可以訪問這個唯一例項,需要在singleton中定義乙個靜態的singleton型別的私有變數。

③為了讓外界可以訪問這個唯一例項,需要增加乙個公有的靜態方法來返回這個唯一例項。

(4)單例模式三要點

①某個類只能有乙個例項(通過私有建構函式實現)。

②它必須自行建立這個例項。

③它必須自行向整個系統提供這個例項(通過公有的靜態方法來實現)。

四、餓漢式單例與懶漢式單例

<1>餓漢式單例

當類被載入時,靜態變數instance會被初始化,此時類的私有建構函式會被呼叫,單例類的唯一例項將被建立。

①類圖

②**

1

public

class

eagersingleton26

7public

static

eagersingleton getinstance()8

11 }

<2>懶漢式單例

懶漢式單例在第一次呼叫getinstance()方法時例項化,在類載入時並不自行例項化,這種技術又稱為延遲載入技術,即需要的時候再載入例項。

①類圖

②**

1

public

class

lazysingleton26

7public

static

lazysingleton getinstance()813

14return

instance;15}

16 }

<3>兩種模式的比較

餓漢式單例類在類載入時就將自己例項化,它的優點在於無須考慮多執行緒訪問問題,可以確保例項的唯一性;從呼叫速度和反應時間角度來講,由於單例物件一開始就被建立,因此要優於懶漢式單例。但是無論系統在執行時是否需要使用該單例物件,由於在類載入時該物件就需要建立,因此從資源利用效率角度來講,餓漢單例不及懶漢單例,而且在系統載入時由於需要建立懶漢式單例物件,載入時間可能會比較長。

懶漢式單例類在第一次使用時建立,無須一直占用系統資源,實現了延遲載入,但是必須處理好多執行緒同時訪問的問題,特別是當單例類作為資源控制器,在例項化時必然涉及資源初始化,而資源初始化很有可能耗費大量時間,這意味著出現多執行緒同時首次引用此類的機率比較大,需要通過雙重檢查鎖定機制進行控制,這將導致系統效能受到一定影響。

五、單例模式總結

1.主要優點

(1)單例模式提供了對唯一例項的受控訪問。

(2)由於系統記憶體中只存在乙個物件,因此可以節約系統資源,對於一些需要頻繁建立和銷毀的物件,單例模式無疑可以提高系統的效能。

(3)允許可變數目的例項。基於單例模式,開發人員可以自行擴充套件,使用與控制單例物件相似的方法來制定個數的例項物件,既節省系統資源,又解決了單例模式物件共享過多有損效能的問題。

2.主要缺點

(1)由於單例模式中沒有抽象層,因此單例類的擴充套件有很大困難。

(2)單例類的職責過重,在一定程度上違背了單一職業原則。因為既提供了業務方法,有提供了建立物件的方法,將物件的建立和物件本身的功能耦合在了一起。

(3)很多物件導向預言的執行環境都提供了自動垃圾**技術,因此,如果例項化的共享物件長時間不利用,系統會認為它是垃圾,會自動銷毀並**資源,下次利用時又將重新例項化,這將導致共享的單例物件狀態的丟失。

3.使用場景

(1)系統只需要乙個例項物件。例如系統要求提供乙個唯一的序列號生成器或資源管理器,或者需要考慮資源消耗太大而只允許建立乙個物件。

(2)客戶呼叫類的單個例項只允許使用乙個公共訪問點,除了該公共訪問點,不能通過其他途徑訪問該例項。

如何保證物件的唯一性

思想 1,不讓其他程式建立該類物件。2,在本類中建立乙個本類物件。3,對外提供方法,讓其他程式獲取這個物件。步驟 1,因為建立物件都需要建構函式初始化,只要將本類中的建構函式私有化,其他程式就無法再建立該類物件 2,就在類中建立乙個本類的物件 3,定義乙個方法,返回該物件,讓其他程式可以通過方法就得...

程式的唯一性

試過各種方法,下面這個相對比較好 在program.cs中,新增如下,紅色字部分要改掉 usingsystem.diagnostics 新增 namespace programunique static class program 應用程式的主入口點。stathread static void ma...

Oracle唯一性約束和唯一性索引的關係

唯一性約束通過唯一性索引來實現?我覺得這說法不對。對於唯一性約束,索引是必須存在的,唯一性約束本質上是通過索引來保證的,但不一定是唯一性索引。唯一性約束允許有null值,唯一性約束的列可允許有多個null值。唯一性約束通過btree索引實現,而btree索引是不會包含null值,但使用null值過濾...