單例模式

概述

  單例模式能夠簡單理解爲一個類只有一個實例化,並提供全局的訪問點。多線程

單例模式存在的意義

  舉個例子,在操做系統中,任務管理器只能存在一個,對吧。那麼接下來的事情就是簡單的實現單例模式了。函數

實現簡單的單例模式

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Singleton
 7 {
 8     public class Singleton
 9     {
10         //使用靜態變量保存類的實例
11         private static Singleton uniqueInstance;
12         
13         //私有構造
14         private Singleton()
15         {
16         }
17 
18         /// <summary>
19         /// 全局訪問點
20         /// </summary>
21         /// <returns></returns>
22         public static Singleton GetInstance()
23         {
24             if (uniqueInstance==null)
25             {
26                 Console.WriteLine("實例化 單例模式.");
27                 uniqueInstance = new Singleton();
28             }
29             else
30             {
31                 Console.WriteLine("返回 單例模式");
32             }
33             return uniqueInstance;
34         }
35 
36     }
37 
38 
39     class Program
40     {
41         static void Main(string[] args)
42         {
43             Singleton.GetInstance();
44             Singleton.GetInstance();
45         }
46     }
47 }

  1.  私有構造函數:

    只有在該類中使用,不能被外界訪問。也就是說,該類不能經過外界 new操做 實例化一個對象。而只能在本類中實例化。this

  2. 靜態變量:

    靜態變量是在堆分配的,而普通變量是在棧上分配的,也就是說它的生存期爲整個源程序。spa

  3. 靜態函數:

    靜態成員函數不能夠調用類的非靜態成員。由於靜態成員函數不含this指針。 這裏,咱們使用靜態函數訪問靜態變量。操作系統

多線程下的單例模式

  在上訴代碼中,若是是多線程的狀況,頗有可能會建立多個實例化。可是咱們想要的是,只要第一次建立該實例,其餘狀況都返回該實例。咱們的解決方案是採用線程加鎖的方式。線程

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Singleton
 7 {
 8     public class Singleton
 9     {
10         //使用靜態變量保存類的實例
11         private static Singleton uniqueInstance;
12         
13         //私有構造
14         private Singleton()
15         {
16         }
17 
18         
19         //線程鎖
20         private static readonly object locker = new object();
21 
22         /// <summary>
23         /// 全局訪問點
24         /// </summary>
25         /// <returns></returns>
26         public static Singleton GetInstance()
27         {
28             if (uniqueInstance==null)
29             {
30                 lock (locker)
31                 {
32                     if (uniqueInstance == null)
33                     {
34                         Console.WriteLine("實例化 單例模式.");
35                         uniqueInstance = new Singleton();
36                     }
37                 }
38             }
39             else
40             {
41                 Console.WriteLine("返回 單例模式");
42             }
43             return uniqueInstance;
44         }
45 
46     }
47 
48 
49     class Program
50     {
51         static void Main(string[] args)
52         {
53             Singleton.GetInstance();
54             Singleton.GetInstance();
55         }
56     }
57 }
相關文章
相關標籤/搜索