【題目描述】
設計乙個類,我們只能生成該類的乙個例項。
【解決方案】
1. 只適用於單執行緒環境
單執行緒環境下可以正常工作。
但是在多執行緒環境下,如果兩個執行緒同時判斷到instance為null,那麼這兩個執行緒都會建立乙個例項,此時的singleton就不滿足單例模式的要求了。
1public
sealed
class
singleton26
7private
static singleton instance = null;8
public
static
singleton instance
9 16}
17 }
2. 多執行緒環境能工作,但效率不高
加同步鎖處理後,能保證在多執行緒環境中也只建立乙個例項。
但是由於在呼叫屬性instance時都會加同步鎖,加鎖又是乙個非常耗時的操作,在沒有必要的時候我們應該盡量避免。
1public
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,而無需去進行加鎖操作,保證只建立乙個例項,相比上述方法,也提高了效率。
由於此**實現比較繁雜且容易出錯,我們可以嘗試更好的解決方案。
1public
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,他會自動呼叫靜態建構函式並建立例項,造成過早地建立例項,從而降低記憶體的使用效率。
1public
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例項,這樣就做到了按需建立。
1public
sealed
class
singleton26
7public
static
singleton instance813
}1415class
nested
1620
internal
static
readonly singleton instance = new
singleton();21}
22 }
【本題擴充套件】
五種單例模式的實現把型別標記為sealed,表示他們不能作為其他型別的基類。現在我們要定義乙個表示**的型別president,可以從該型別繼承出frenchpresident和americanpresident等型別,這些派生類都只能產生乙個例項。請問該如何設計實現這些型別?
我的**實現,僅供參考:
1class
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.定義乙個返回值為類...