設計模式 單例模式

2021-09-29 16:21:11 字數 1767 閱讀 5718

在軟體設計中,有時確實存在乙個類僅能用來產生乙個唯一物件的必要性。例如,乙個大公司的列印室雖然可以有多台印表機,但是其列印管理系統中只有乙個列印任務控制物件,該物件管理列印排隊並分配列印任務給各印表機。再如,在windows系統中,應該只有乙個檔案系統與乙個檔案管理系統(windows manager)。

怎樣才能確保乙個類只有乙個例項?有兩種方法解決該問題,乙個是程式設計師在應用程式中使用**保證僅有乙個例項被建立,另外一種方法是不依靠應用程式設計師,而是精心設計需要僅有乙個例項的類,由該類本身的結構確保其僅能夠被建立乙個例項。實踐證明,第二個方法從根本上上保證僅有乙個例項被建立的有效方法。這就是單例模式(singleton pattern)所要表述的內容。

單例模式(singleton pattern),屬於建立型別的一種常用的軟體設計模式。通過單例模式的方法建立的類在當前程序中只有乙個例項(根據需要,也有可能乙個執行緒中屬於單例,如:僅執行緒上下文內使用同乙個例項)

單例模式是指確保乙個類僅有唯一的例項,並且提供乙個全域性的訪問點。

為了防止客戶程式利用構造方法建立多個物件,將構造方法宣告為private 型別。其原因是,如果構造方法是public 型別的,則客戶程式永遠可以使用該構造方法建立不同物件。但這樣做的問題是,如果乙個類的構造方法是private 型別的,其他類就無法使用該構造方法來建立物件,從而該類就成為乙個不可用的類。

為了解決這個問題,該類必須提供乙個獲得例項的方法,通常稱為getinstance() 方法。該方法返回乙個類的例項。值得注意的是,該方法必須是靜態方法,否則客戶端將無法呼叫該方法。應該確保無論客戶程式呼叫該getinstance() 方法多少次,得到的始終是同乙個物件。

為了滿足上述要求,可將乙個希望客戶類僅能建立乙個例項的類president 設計如下:

public

class

president

public

static singleton getinstance

(string name)

}

以上類的設計保證了僅有乙個president 物件被建立。

單例模式結構類圖:

1. 單例模式的優點

嚴格控制客戶程式訪問其唯一的例項。因為單例類封裝了其唯一的例項,它可以嚴格控制在何時客戶程式以怎樣的方式訪問他。

單例類可以帶有一些子類,它的每個子類都是單例類。每個子類有不同的行為,從而使應用客戶程式可以在執行時配置不同的子類物件。

該模式的singleton 類可以比較容易地改變為允許建立一定數目物件的類。

例:考慮乙個單位的網際網路連線問題。該單位對外的網際網路使用乙個統一的ip位址,所有的內部使用者都使用乙個統一的內部伺服器。當乙個使用者要連線到網際網路上時,該使用者應該首先連線到內部伺服器上。該連線應該是經過驗證的。這裡需要設計乙個登陸驗證系統,以便驗證客戶資訊是否正確。

1. 類設計圖

網際網路連線系統類圖:

**連線:【例2.6】-單例模式-網際網路連線

舉世皆濁我獨清,眾人皆醉我獨醒

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...