Ensure a class only has one instance, and provide a global point of access to.多線程
保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。ide
1. 一個類只有一個實例;函數
2. 必須自行建立實例;spa
3. 自行向整個系統提供實例線程
1. 單例模式的類只提供私有的構造函數;3d
2. 類定義含有類的靜態私有對象;code
3. 提供一個靜態的共有函數建立或獲取自己的靜態私有對象;對象
class Singleton { private static Singleton instance; //構造方法設爲private,防止外界new建立實例 private Singleton() { } //獲取本類實例的惟一全局訪問點 public static Singleton Getinstance() { //若實例不存在,則new一個新的實例,不然返回已有實例 if (instance == null) { instance = new Singleton(); } return instance; } }
調用方法:blog
Singleton singleton = Singleton.Getinstance();
第一次引用時,纔會將本身實例化生命週期
class Singleton { private static Singleton instance; private static readonly object _syncRoot = new object(); //構造方法設爲private,防止外界new建立實例 private Singleton() { } //獲取本類實例的惟一全局訪問點 public static Singleton Getinstance() { //先判斷實例是否存在,不存在再加鎖處理 if (instance == null) { //lock確保當一個線程位於代碼的臨界區時,另外一個線程不進入臨界區 //其餘線程試圖進入鎖定的代碼,它將一直等待 lock (_syncRoot) { //若實例不存在,則new一個新的實例,不然返回已有實例 if (instance == null) { instance = new Singleton(); } } } return instance; } }
在本身加載時將本身實例化
//sealed:阻止發生派生,派生可能會增長實例 public sealed class Singleton { //readonly第一次引用類的任何成員時建立實例; //公共語言運行庫複測處理變量初始化 private static readonly Singleton instance = new Singleton(); private Singleton() { } public static Singleton Getinstance() { return instance; } }
1. 實例控制:阻止其餘對象實例化其本身單例對象的副本,從而保證全部對象都訪問惟一實例;
2. 靈活性
1. 開銷:每次請求時都須要檢查是否存在類的實例。用靜態初始化解決此問題。
2. 可能的開發混淆:開發時不能用new關鍵字實例化對象。
3. 對象生命週期:不能解決刪除單個對象的問題。
資源管理器
打印機