Singleton模式的实现
1.實現Singleton模式
設計一個類,我們只能生成該類的一個實例。
2.低級解法一:只適用于單線程環境
因為我們只能生成一個實例,所以我們必須把構造函數設置為私有函數已禁止他人創建實例。可以定義一個靜態的實例,在需要的時候創建該實例。
public sealed class Sinleton1 {private Singleton1() {}private static Singleton1 instance = null;public static Singleton1 instance{get{if(instance == null)instance = new Singleton1();return instance;}} }代碼中,Singleton的靜態屬性Instance中,只有在instance為null的時候才會創建一個實例避免重復創建。同時我們吧構造函數定義為私有函數,這樣就能確保只創建一個實例。
3.低級解法二:雖然在多線程環境中能運行但是效率低下
2中的代碼在單線程中是可以工作的,但是再多線程的情況下就會出現問題。假如兩個線程同時運行到判斷 instance==null語句時,并且這個時候instance確實沒有被創建,那么兩個線程都會創建一個instance,此時類型Singleton就不滿足單例模式的要求了。為了保證多線程條件下,我們仍能只得到類型的一個實例,需要加上一個同步鎖。代碼如下:
public sealed class Singleton2 {private Singleton2() {}private static readonly object syncObj = new object();private static Singleton2 instance = null;public static Singleton2 Instance{get{lock(syncObj){if(instance == null)instance = new Singleton2();}return instance;}} }由于一個時刻只有一個線程能得到同步鎖,當第一個線程加上瑣事,第二個線程只能等待。當地一個線程發現實例還沒有創建時,他會創建一個實例。接著第一個線程釋放同步鎖,此時第二個線程可以加上同步鎖,并運行接下來的代碼。這個時候由于實例已經被第一個線程創建出來了,第二個線程就不會創建實例了。這就保證了我們在多線程換金鐘只能得到一個實例。
然而我們不得不接受這樣的一個現實,每次通過屬性Instance得到Singleton2的實例,都會試圖加上一個同步鎖,而加鎖是一個非常耗時的操作,在沒有必要的時候應該避免。
4.高級解法一:嵌套類
public sealed class Singleton3 {Singleton3() {}public static Singleton3 Instance{get{return Nested.instance;}}class Nested{static Nested() {}internal static readonly Singleton3 instance = new Singleton3();} } 內部定義了一個私有類型Nested,當第一次用到這個嵌套類型的時候,就會調用靜態構造函數Singleton3的實例instance。類型Nested只在屬性Singleton3.instance中被用到,由于它是私有的,其他人無法使用Nested類型。因此,當我們第一次試圖通過屬性Singleton3Instance得到Singleton3的實例時,會自動調用Nested的靜態構造函數創建實例instance。總結
以上是生活随笔為你收集整理的Singleton模式的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个 人 简 历
- 下一篇: Visual Studio 调试器---