单例模式

概述

  单例模式可以简单理解为一个类只有一个实例化,并提供全局的访问点。

单例模式存在的意义

  举个例子,在操作系统中,任务管理器只能存在一个,对吧。那么接下来的事情就是简单的实现单例模式了。

实现简单的单例模式

 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张图片

  1.  私有构造函数:

    只有在该类中使用,不能被外界访问。也就是说,该类不能通过外界 new操作 实例化一个对象。而只能在本类中实例化。

  2. 静态变量:

    静态变量是在堆分配的,而普通变量是在栈上分配的,也就是说它的生存期为整个源程序。

  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 }

 

你可能感兴趣的:(单例模式)