单例模式(泛型表示法)

  下面是单例模式的泛型表示形式,主要思路是利用泛型单例提供者类中的单例创建者类结合来实现,相关的说明在代码中已注释,不懂的可以留言。

  以下只是泛型单例的一种实现方式,还可以有其他多种实现,不过本人觉得这种方式比较简单易懂点。

  单例模式的要点是:确保一个类只有一个实例,并提供对该实例的全局访问。

   

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Diagnostics;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading;
 7 using System.Threading.Tasks;
 8 
 9 namespace MyExamples.App
10 {
11     /// <summary>
12     /// 泛型单例提供者类(或称单例工厂),根据T类型创建相应的实例对象;
13     /// new():表明T类型能够被实例化。
14     /// </summary>
15     /// <typeparam name="T"></typeparam>
16     public class SingletonProvider<T> where T : new()
17     {
18         /// <summary>
19         /// 私有构造函数:使用 private 修饰符来清楚地表明该类不能被实例化
20         /// </summary>
21         private SingletonProvider()
22         {
23         }
24 
25         /// <summary>
26         /// 定义一个公开的静态的属性,提供外部程序调用;
27         /// </summary>
28         public static T Instance
29         {
30             get
31             {
32                 
33                 return SingletonCreator.instance;
34             }
35         }
36        
37         /// <summary>
38         /// 单例创建者类
39         /// 实现原理是:利用只读字段与静态构造函数的特点来实例化一个唯一的对象;
40         /// 静态构造函数一旦被某个线程执行,其他线程则不能再调用,获取T类型实例时,直接返回静态只读的instance;
41         /// </summary>
42         private class SingletonCreator
43         {
44             /// <summary>
45             /// 只读字段:只能在静态构造函数或初始化时赋值
46             /// </summary>
47             internal static readonly T instance;
48 
49             /// <summary>
50             /// 静态构造函数仅调用一次
51             /// </summary>
52             static SingletonCreator()
53             {
54                 SingletonProvider<T>.SingletonCreator.instance = new T();
55             }
56         }
57     }
58 
59     class Program
60     {
61         static void Main(string[] args)
62         {
63             for (int i = 0; i < 100; i++)
64             {
65                 var thread = new Thread(new ThreadStart(Run));
66                 thread.Start();
67             }
68             Console.Read();
69         }
70 
71         static void Run()
72         {
73             Console.WriteLine(SingletonProvider<MyJob>.Instance.Write());
74         }
75     }
76 
77     public class MyJob
78     {
79         private string _timeSpan;
80 
81         public MyJob()
82         {
83             _timeSpan = DateTime.Now.Millisecond.ToString();
84         }
85 
86         public string Write()
87         {
88             //Debug.WriteLine(_timeSpan);
89             return _timeSpan;
90         }
91     }
92 }
源代码
原文地址:https://www.cnblogs.com/Jonish/p/3233432.html