即保證一類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
缺點:保證單一例項:建立private static型別的物件instance,其為空時才new例項化建立
全域性訪問點:建立public類getinstance()方法用於全域性訪問instance,並擔當檢測、new instance的責任
//單例類:
class singleton
//單一的例項
private static singleton instance;
//全域性訪問點
public static singleton getinstance()
else
return instance;
}}//測試類:
class program
}
根據new關鍵字例項化單例的先後順序,可把單例模式分為餓漢式單例、懶漢式單例:
//餓漢式:開始時就例項化instance
public class singleton
private static singleton instance = new singleton();
public static singleton getinstance()
}
//懶漢式:需要時才例項化instance
public class singleton
private static singleton instance;
public static singleton getinstance()
}
在上述懶漢式單例中,若多個執行緒同時進行到if (instance == null)
,會全部檢測通過,最終造成多執行緒下建立了多個例項,即多執行緒不安全。因此需要對多執行緒下的單例模式進行調整,使用lock機制實現執行緒安全:
//餓漢式 + 執行緒安全 + 單鎖
class singleton
private static singleton instance;
//靜態唯讀物件用於輔助實現lock
private static readonly object locker = new object();
public static singleton getinstance()
return instance;}}
雖然加了lock鎖實現了懶漢模式下的執行緒安全,但我們不難發現乙個問題:若已經存在instance例項,在執行getinstance()時還有必要lock{}嗎?顯然不需要,lock的使用必然是消耗一定空間的,因此為了節省lock的空間,採用更優解法:雙重鎖定(double-check-locking):
//餓漢式 + 執行緒安全 + 雙鎖
class singleton
private static singleton instance;
//靜態唯讀物件用於輔助實現lock
private static readonly object locker = new object();
public static singleton 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...