• 单例模式(泛型表示法)


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

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

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

       

     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 }
    源代码
  • 相关阅读:
    SecureCRT的设置和美化
    strtod-strtod, 字符串 转 数字 函数
    Debug : array type has incomplete element type
    Linux上Core Dump文件的形成和分析
    centos7,进程最大打开文件数 too many open files错误
    不使用临时变量交换两个值
    C语言的设计理念
    K&R C vs ANSI C(数据类型提升)
    再也不怕C语言的声明了
    K&R C vs ANSI C(数据类型转换)
  • 原文地址:https://www.cnblogs.com/Jonish/p/3233432.html
Copyright © 2020-2023  润新知