一、單例模式概述
單例模式是結構最簡單的設計模式。
如何保證乙個類只有乙個例項並且這個例項易於被訪問呢?定義乙個統一的·全域性變數確保物件隨時都可以被訪問,但不能保證防止建立多個物件。乙個更好的解決辦法是讓類自身負責建立和儲存它的唯一例項,並保證不能建立其他例項,它還提供乙個可以訪問例項的方法,這就是到單例模式的動機。
單例模式定義:確保乙個類只有乙個例項,並提供乙個全域性訪問點來訪問這個唯一例項。
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 餓漢式單例類圖
由於在靜態變數的時候例項化了單例類,因此在類架子啊時單例物件已建立,**如下:
2、懶漢式單例類與雙重檢查鎖定class eagersingleton
//靜態公有工廠方法,返回唯一例項
public static eagersingleton getinstance()
}
與餓漢式不同的,懶漢式單例類在第一次被引用時將自己例項化,在懶漢式單例類載入時不將自己例項化。懶漢式單例類的結構如圖所示:
圖 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...