单例模式(泛型表⽰法)
  下⾯是单例模式的泛型表⽰形式,主要思路是利⽤泛型单例提供者类中的单例创建者类结合来实现,相关的说明在代码中已注释,不懂的可以留⾔。  以下只是泛型单例的⼀种实现⽅式,还可以有其他多种实现,不过本⼈觉得这种⽅式⽐较简单易懂点。
  单例模式的要点是:确保⼀个类只有⼀个实例,并提供对该实例的全局访问。
1using System;
2using System.Collections.Generic;
3using System.Diagnostics;
4using System.Linq;
5using System.Text;
6using System.Threading;
7using System.Threading.Tasks;
8
9namespace MyExamples.App
10 {
11///<summary>
12///泛型单例提供者类(或称单例⼯⼚),根据T类型创建相应的实例对象;
13/// new():表明T类型能够被实例化。
14///</summary>
15///<typeparam name="T"></typeparam>
16public class SingletonProvider<T> where T : new()
17    {
18///<summary>
19///私有构造函数:使⽤ private 修饰符来清楚地表明该类不能被实例化
20///</summary>
21private SingletonProvider()
22        {
23        }
24
25///<summary>
26///定义⼀个公开的静态的属性,提供外部程序调⽤;
27///</summary>
28public static T Instance
29        {
30get
31            {
32
33return SingletonCreator.instance;
34            }
35        }
36
37///<summary>
38///单例创建者类
39///实现原理是:利⽤只读字段与静态构造函数的特点来实例化⼀个唯⼀的对象;
40///静态构造函数⼀旦被某个线程执⾏,其他线程则不能再调⽤,获取T类型实例时,直接返回静态只读的instance;
41///</summary>
42private class SingletonCreator
43        {
44///<summary>
45///只读字段:只能在静态构造函数或初始化时赋值
46///</summary>
47internal static readonly T instance;
48
49///<summary>
单例模式的几种实现方式
50///静态构造函数仅调⽤⼀次
51///</summary>
52static SingletonCreator()
53            {
54                SingletonProvider<T>.SingletonCreator.instance = new T();
54                SingletonProvider<T>.SingletonCreator.instance = new T();
55            }
56        }
57    }
58
59class Program
60    {
61static void Main(string[] args)
62        {
63for (int i = 0; i < 100; i++)
64            {
65var thread = new Thread(new ThreadStart(Run));
66                thread.Start();
67            }
68            Console.Read();
69        }
70
71static void Run()
72        {
73            Console.WriteLine(SingletonProvider<MyJob>.Instance.Write());
74        }
75    }
76
77public class MyJob
78    {
79private string _timeSpan;
80
81public MyJob()
82        {
83            _timeSpan = DateTime.Now.Millisecond.ToString();
84        }
85
86public string Write()
87        {
88//Debug.WriteLine(_timeSpan);
89return _timeSpan;
90        }
91    }
92 }
源代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。