基于静态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();
}
}
测试结果
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
RocketMQ之NameServer架构设计及启动关闭流程源码分析
![](https://img.aspxhome.com/file/2023/7/80937_0s.jpg)
C#验证身份证号码正确性的实例代码(收藏)
MybatisPlus实现简单增删改查功能
![](https://img.aspxhome.com/file/2023/4/73044_0s.jpg)
C#观察者模式(Observer Pattern)实例教程
java线程并发控制同步工具CountDownLatch
![](https://img.aspxhome.com/file/2023/1/75461_0s.jpg)
idea创建SpringBoot项目时Type选maven project和maven pom有何区别
![](https://img.aspxhome.com/file/2023/9/57499_0s.png)
深入浅析jni中的java接口使用
![](https://img.aspxhome.com/file/2023/8/63168_0s.png)
springboot扩展MVC的方法
![](https://img.aspxhome.com/file/2023/0/70270_0s.png)
Spring Boot从Controller层进行单元测试的实现
Java中io流解析及代码实例
![](https://img.aspxhome.com/file/2023/5/58195_0s.jpg)
解决Spring Batch框架job任务只跑一次的问题
一文教会你使用jmap和MAT进行堆内存溢出分析
![](https://img.aspxhome.com/file/2023/3/58763_0s.png)
Mybatis无法获取带有下划线前缀的字段的值问题
![](https://img.aspxhome.com/file/2023/3/62173_0s.png)
Java程序设计之12个经典样例
C#用匿名方法定义委托的实现方法
图解Java经典算法冒泡排序的原理与实现
![](https://img.aspxhome.com/file/2023/0/71020_0s.gif)
使用springCloud+nacos集成seata1.3.0搭建过程
![](https://img.aspxhome.com/file/2023/7/63397_0s.png)
浅谈Mybatis通用Mapper使用方法
jQuery.event.trigger()的简单解释
![](https://img.aspxhome.com/file/2023/2/62232_0s.png)
Java特性之注解和异常 Throwable
![](https://img.aspxhome.com/file/2023/4/82994_0s.png)