面試題2 實現Singleton模式

2022-07-27 11:51:14 字數 3278 閱讀 5227

【題目描述】

設計乙個類,我們只能生成該類的乙個例項。

【解決方案】

1. 只適用於單執行緒環境

單執行緒環境下可以正常工作。

但是在多執行緒環境下,如果兩個執行緒同時判斷到instance為null,那麼這兩個執行緒都會建立乙個例項,此時的singleton就不滿足單例模式的要求了。

1

public

sealed

class

singleton26

7private

static singleton instance = null;8

public

static

singleton instance

9 16}

17 }

2. 多執行緒環境能工作,但效率不高

加同步鎖處理後,能保證在多執行緒環境中也只建立乙個例項。

但是由於在呼叫屬性instance時都會加同步鎖,加鎖又是乙個非常耗時的操作,在沒有必要的時候我們應該盡量避免。

1

public

sealed

class

singleton26

7private

static

readonly object syncobj = new

object

();8

9private

static singleton instance = null;10

public

static

singleton instance

1119

return

instance;20}

21}22 }

3. 加同步鎖前後兩次判斷例項是否已經存在

加鎖之前進行判斷例項是否已經建立,可以保證例項已經建立後,則可以直接返回instance,而無需去進行加鎖操作,保證只建立乙個例項,相比上述方法,也提高了效率。

由於此**實現比較繁雜且容易出錯,我們可以嘗試更好的解決方案。

1

public

sealed

class

singleton26

7private

static

readonly object syncobj = new

object

();8

9private

static singleton instance = null;10

public

static

singleton instance

1121}22

return

instance;23}

24}25 }

4. 利用靜態建構函式

由於c#是在呼叫靜態建構函式時初始化靜態變數,.net執行時能夠確保只呼叫一次靜態建構函式,這樣我們就可以確保只初始化一次instance。

但是,根據靜態建構函式的特性,例項instance並不是第一次呼叫屬性singleton.instance時建立,而是在第一次用到singleton的時候就會被建立。假設我們在singleton中新增乙個靜態方法呼叫該靜態方法是不需要建立例項的,但是由於你使用了singleton,他會自動呼叫靜態建構函式並建立例項,造成過早地建立例項,從而降低記憶體的使用效率。

1

public

sealed

class

singleton26

7private

static singleton instance = new

singleton();

8public

static

singleton instance914

}15 }

5. 實現按需建立例項

內部定義乙個私有型別nested,型別nested只在呼叫singeton.instance時被使用,由於其私有屬性他人無法使用nested型別。

因此當我們第一次呼叫sington.instance時,會呼叫nested的靜態建構函式,並初始化靜態變數。如果我們不呼叫屬性sington.instance,則不會建立instance例項,這樣就做到了按需建立。

1

public

sealed

class

singleton26

7public

static

singleton instance813

}1415class

nested

1620

internal

static

readonly singleton instance = new

singleton();21}

22 }

【本題擴充套件】

五種單例模式的實現把型別標記為sealed,表示他們不能作為其他型別的基類。現在我們要定義乙個表示**的型別president,可以從該型別繼承出frenchpresident和americanpresident等型別,這些派生類都只能產生乙個例項。請問該如何設計實現這些型別?

我的**實現,僅供參考:

1

class

president24

5sealed

class

frenchpresident:president610

11public

static

frenchpresident instance

1217}18

19class

nested

2024

internal

static

readonly frenchpresident instance = new

frenchpresident();25}

26}2728

sealed

class

americanpresident : president

2933

34public

static

americanpresident instance

3540}41

42class

nested

4347

internal

static

readonly americanpresident instance = new

americanpresident();48}

49 }

面試題2 實現Singleton模式

題目 設計乙個類,我們只能生成該類的乙個例項。只能生成乙個例項的類是實現singleton 單例 模式的型別。由於設計模式在物件導向程式設計中起著舉足輕重的作用,面試中經常會出現這樣的面試題。不好得解決方法一 只適用於單執行緒環境 public sealed class singleton priv...

面試題2 實現Singleton模式

題目 設計乙個類,我們只能生成該類的乙個例項 考察點 單例模式 知識點 主要介紹兩種 懶漢式 餓漢式單例。單例模式有以下特點 1.單例類只能有乙個例項。2.單例類必須自己建立自己的唯一例項。3.單例類必須給所有其他物件提供這一例項。單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例...

面試題2 實現Singleton模式

實現singleton模式 要求熟練掌握 單例模式的要求 類在記憶體中只能有乙個例項 1.該物件不能是全域性物件或者棧物件 2.該物件是乙個堆物件 靜態成員函式與普通成員函式的區別 單例模式的實現步驟 1.將建構函式私有化 2.在類中定義乙個靜態的指標物件,並在類外初始化為空 3.定義乙個返回值為類...