下面是单例模式的泛型表示形式,主要思路是利用泛型单例提供者类中的单例创建者类结合来实现,相关的说明在代码中已注释,不懂的可以留言。
以下只是泛型单例的一种实现方式,还可以有其他多种实现,不过本人觉得这种方式比较简单易懂点。
单例模式的要点是:确保一个类只有一个实例,并提供对该实例的全局访问。
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 }