要求:設計乙個類,只能生產該類的乙個例項。
c#單例模式(singleton):不是根據客戶程式呼叫生成乙個新的例項,而是控制某個型別的例項數量,保證唯一性。關鍵在於整個程式的生命週期中,任何時刻被指定的類只有乙個例項,並為客戶程式提供乙個獲取該例項的全域性訪問點。
接下來將會介紹五種單例模式的設計。
一、單執行緒下的單例模式(經典模式)
public sealed class singleton1
private static singleton1 instance;
private singleton1()
public static singleton1 getinstance()
return instance;
}這種模式的缺點是沒有考慮執行緒併發獲取例項問題。
二、多執行緒低效率的單例模式
public sealed class singleton2
private static readonly object synobj = new object();
private static singleton2 instance = null;
private singleton2()
public static singleton2 getinstance()
getlock( synobj )
if( instance == null;
instance = new singleton2();
}return instance;
三、雙重鎖形式,同步鎖前後兩次判斷例項是否存在
public sealed class singleton3
private static object synobj = new object();
private static singleton3 instance = null;
private singleton3
public static singleton3 getinstance()
getif( instance == null )
lock( synobj )
if( instance == null )
instance = new singleton3();
return instance;
說明:在singleton3中只有當instance為null,即沒有建立時,才需要加鎖操作;當instance已被建立時,其他執行緒則無需加鎖操作,節省時間。
四、利用靜態建構函式實現單例模式
靜態建構函式,在使用之前由執行時自動呼叫,且保證只呼叫一次。特點:先初始化型別的靜態變數,再執行函式體內的語句。
public sealed class singleton4
private static singleton4 instance = new singleton4();
private singleton4
}public static singleton4 getinstance()
getreturn instance;
五、實現按需建立單例模式例項
public sealed class singleton5
singleton5()
public static singleton5 getinstance()
getreturn nested.instance;}}
class nested
static nested()
internal static readonle singleton5 instance = new singleton5();
總上五種方法,是在c#中實現單例模式的方法,其中首推的是方法4和方法5,。
2 單例模式
一 簡介 什麼是單例模式?單例模式是指 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式實現一 使用類方法實現 class singleton object instance none classmethod definstance cls if cls.instance retur...
單例模式(2)
例項化 執行建構函式 填充屬性 初始化 spring依賴注入bean例項預設是單例的 org.springframework.beans.factory.support.abstractbeanfactoryprotected t dogetbean final string name,nullab...
2 單例模式
單執行緒環境 public class singleton1 private static singleton1 instance null public static singleton1 getinstance 先加鎖後判斷,但是加鎖開銷大,效率不高 public class singleton...