基于静态Singleton模式的使用介绍

时间:2022-09-13 20:11:08 

什么是静态单例模式?

静态单例模式(Static Singleton Pattern)是我在实践中总结的模式,主要解决的问题是在预先知道某依赖项为单例应用时,通过静态缓存该依赖项来提供访问。当然,解决该问题的办法有很多,这只是其中一个。

实现细节


/// <summary>
  /// 静态单例
  /// </summary>
  /// <typeparam name="TClass">单例类型</typeparam>
  public static class Singleton<TClass> where TClass : class, new()
  {
    private static readonly object _lock = new object();
    private static TClass _instance = default(TClass);

    /// <summary>
    /// 获取单例实例
    /// </summary>
    public static TClass GetInstance()
    {
      return Instance;
    }

    /// <summary>
    /// 单例实例
    /// </summary>
    public static TClass Instance
    {
      get
      {
        if (_instance == null)
        {
          lock (_lock)
          {
            if (_instance == null)
            {
              _instance = new TClass(); // must be public constructor
            }
          }
        }

        return _instance;
      }
    }

    /// <summary>
    /// 设置单例实例
    /// </summary>
    /// <param name="instance">单例实例</param>
    public static void Set(TClass instance)
    {
      lock (_lock)
      {
        _instance = instance;
      }
    }

    /// <summary>
    /// 重置单例实例
    /// </summary>
    public static void Reset()
    {
      lock (_lock)
      {
        _instance = default(TClass);
      }
    }
  }

应用测试


class Program
  {
    interface IInterfaceA
    {
      string GetData();
    }
    class ClassA : IInterfaceA
    {
      public string GetData()
      {
        return string.Format("This is from ClassA with hash [{0}].", this.GetHashCode());
      }
    }
    static void Main(string[] args)
    {
      string data1 = Singleton<ClassA>.GetInstance().GetData();
      Console.WriteLine(data1);
      string data2 = Singleton<ClassA>.GetInstance().GetData();
      Console.WriteLine(data2);

      Console.ReadKey();
    }
  }

测试结果

基于静态Singleton模式的使用介绍

标签:singleton模式
0
投稿

猜你喜欢

  • RocketMQ之NameServer架构设计及启动关闭流程源码分析

    2021-07-30 20:43:56
  • C#验证身份证号码正确性的实例代码(收藏)

    2023-12-18 17:28:33
  • MybatisPlus实现简单增删改查功能

    2021-12-27 06:25:21
  • C#观察者模式(Observer Pattern)实例教程

    2021-07-13 02:53:39
  • java线程并发控制同步工具CountDownLatch

    2022-09-02 12:18:06
  • idea创建SpringBoot项目时Type选maven project和maven pom有何区别

    2023-07-04 07:20:27
  • 深入浅析jni中的java接口使用

    2023-07-22 19:54:23
  • springboot扩展MVC的方法

    2023-12-15 14:19:05
  • Spring Boot从Controller层进行单元测试的实现

    2023-07-21 03:07:10
  • Java中io流解析及代码实例

    2023-08-22 16:46:48
  • 解决Spring Batch框架job任务只跑一次的问题

    2023-01-07 00:13:53
  • 一文教会你使用jmap和MAT进行堆内存溢出分析

    2023-11-06 08:01:57
  • Mybatis无法获取带有下划线前缀的字段的值问题

    2023-07-20 10:06:33
  • Java程序设计之12个经典样例

    2022-09-22 18:44:00
  • C#用匿名方法定义委托的实现方法

    2021-07-08 22:49:07
  • 图解Java经典算法冒泡排序的原理与实现

    2023-03-14 21:41:23
  • 使用springCloud+nacos集成seata1.3.0搭建过程

    2022-06-19 02:48:47
  • 浅谈Mybatis通用Mapper使用方法

    2023-02-15 17:46:52
  • jQuery.event.trigger()的简单解释

    2023-05-24 03:41:37
  • Java特性之注解和异常 Throwable

    2023-04-22 13:14:53
  • asp之家 软件编程 m.aspxhome.com