設計模式 單例模式

2021-07-31 06:41:50 字數 1955 閱讀 6209

一、單例模式概述

單例模式是結構最簡單的設計模式。

如何保證乙個類只有乙個例項並且這個例項易於被訪問呢?定義乙個統一的·全域性變數確保物件隨時都可以被訪問,但不能保證防止建立多個物件。乙個更好的解決辦法是讓類自身負責建立和儲存它的唯一例項,並保證不能建立其他例項,它還提供乙個可以訪問例項的方法,這就是到單例模式的動機。

單例模式定義:確保乙個類只有乙個例項,並提供乙個全域性訪問點來訪問這個唯一例項。

singleton pattern:ensure a class has only one instance,and provide a global point of access tom it.

單例模式是一種物件建立模式。單例模式有3個要點:一是某個類只能有乙個例項;二是它自行建立這個例項;三是它必須自行向整個系統提供這個例項。

二、單例模式的結構與實現

1、結構

單例模式是結構最簡單的設計模式,它值包含乙個類,即單例類。單例模式的結構如圖所示:

圖 1 單例模式結構圖

由圖可知

單例模式只包含乙個單例角色----singleton(單例),在單例類的內部建立它的唯一例項,並通過靜態方法geyinstance()讓客戶端可以使用它的唯一例項。為了防止在外部對單例類例項化,將其建構函式的可見性設為private,並在單例類內部定義乙個singleton型別的靜態物件,作為供外部共享訪問的唯一例項。

2、實現

通常單例模式的實現**如下:

class singleton

//靜態公有工廠方法,返回唯一例項

public static singleton getinstance()

}

下面是測試**:

using system;

class progrem

console.read();

}}

測試**輸出:兩個物件是相同例項

說明兩次呼叫getinstance()所獲得的物件是同乙個例項物件,,並無法再外部對singleton進行例項化,因此能夠確保系統中只有唯一的乙個singleton物件。

在單例模式實現的過程中,我們需要注意:

(1)單例類建構函式的可見性為private.

(2)提供乙個型別為自身的靜態私有成員變數。

(3)提供乙個公有的靜態工廠方法。

三、單例模式的分類:

1、餓漢式單例類

餓漢式單例類是實現起來最簡單的單例類,結構如下:

圖 2  餓漢式單例類圖

由於在靜態變數的時候例項化了單例類,因此在類架子啊時單例物件已建立,**如下:

class eagersingleton

//靜態公有工廠方法,返回唯一例項

public static eagersingleton getinstance()

}

2、懶漢式單例類與雙重檢查鎖定

與餓漢式不同的,懶漢式單例類在第一次被引用時將自己例項化,在懶漢式單例類載入時不將自己例項化。懶漢式單例類的結構如圖所示:

圖 3  懶漢式單例類圖

修改之後的懶漢式單例類**如下:

class lazysingleton

//靜態公有工廠方法,返回唯一例項

public static lazysingleton getinstance()

}} return instance;

}}

設計模式 單例模式

單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...