單例模式,也叫單子模式,是一種常用的軟體設計模式,屬於建立型模式的一種。在應用這個模式時,單例物件的類必須保證只有乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊。又比如,windows 中只能開啟乙個任務管理器,這樣可以避免因開啟多個任務管理器視窗而造成記憶體資源的浪費,或出現各個視窗顯示內容的不一致等錯誤。
單例模式的優點:
單例模式的缺點:
單例模式的應用場景主要有以下幾個方面:
實現單例模式的思路是:
單例模式在多執行緒的應用場合下必須小心使用:
如果當唯一例項尚未建立時,有兩個執行緒同時呼叫建立方法,那麼它們同時沒有檢測到唯一例項的存在,從而同時各自建立了乙個例項,這樣就有兩個例項被構造出來,從而違反了單例模式中例項唯一的原則。 解決這個問題的辦法是為指示類是否已經例項化的變數提供乙個互斥鎖(雖然這樣會降低效率)。
單例模式通常有兩種實現形式:懶漢式單例與餓漢式單例。
1. 執行緒不安全的懶漢式
特點:因為沒有加鎖 synchronized,所以在多執行緒時不能正常工作。
package pers.designpattern.singleton;
public
class
nonthreadsafelazy
public
static nonthreadsafelazy getinstance()
return instance;
}}
2. 執行緒安全的懶漢式
特點:這種實現方式第一次呼叫才初始化例項,避免記憶體浪費;但是效率很低,因為這種加鎖方式會影響效率。
package pers.designpattern.singleton;
public
class
threadsafelazy
public
static
synchronized threadsafelazy getinstance()
return instance;
}}
3. 雙檢鎖的懶漢式
特點:採用雙檢索(dcl,即 double-checked locking)模式,能夠保證執行緒安全且在多執行緒情況下能保持高效能。
package pers.designpattern.singleton;
public
class
dcllazy
public
static dcllazy getinstance()
}return instance;
}}
4. 靜態內部類的懶漢式(推薦)
載入乙個類時,其內部類不會同時被載入。乙個類被載入,當且僅當其某個靜態成員(靜態域、構造器、靜態方法等)被呼叫時發生。 由於在呼叫 staticsingleton.getinstance() 的時候,才會對單例進行初始化,而且通過反射,是不能從外部類獲取內部類的屬性的;由於靜態內部類的特性,只有在其被第一次引用的時候才會被載入,所以可以保證其執行緒安全性。
特點:兼顧了懶漢模式的記憶體優化(使用時才初始化)以及餓漢模式的安全性(不會被反射入侵)。
package pers.designpattern.singleton;
public
class
staticinnerclasslazy
private
staticinnerclasslazy()
public
static staticinnerclasslazy getinstance()
}
1. 餓漢式
特點:沒有加鎖,執行效率會提高;但是類載入時就初始化例項,浪費記憶體。
package pers.designpattern.singleton;
public
class
hungry
public
static hungry getinstance()
}
2. 列舉實現餓漢式
特點:建立列舉預設就是執行緒安全的,所以不需要擔心double checked locking,而且還能防止反序列化導致重新建立新的物件。保證只有乙個例項(即使使用反射機制也無法多次例項化乙個列舉量)。
package pers.designpattern.singleton;
public
enum enumerationhungry
參考:
設計模式 單例模式
單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...