Q2 C 單例模式

2021-07-11 20:49:23 字數 1851 閱讀 2002

要求:設計乙個類,只能生產該類的乙個例項。

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...