C# 单例模式总结
C# 单例模式总结
一 技术目标
单例模式可以说是在开发过程中最常用的一种设计模式了,一般很多业务处理层都会实现单例模式。
单例模式分为懒汉式和饿汉式,懒汉式是在调用的时候生成唯一的实例,饿汉式是在系统初始化的时候就实现实例。这里有一个有意思的问题,如何在不知道程序的时候,判断单例是懒汉式或者是饿汉式?
单例的实现是有固定模式的:
- 私有化构造函数
- 生产全局唯一静态实例
那么C#中有几种实现单例的方法呢?目前,我知道的有5中方法
二 技术过程
- 懒汉式1 -- 经典双if + 锁
public class S1
{
// 1. 私有化构造函数
private S1()
{
}
// 2. 提供静态实例
private static readonly object LocObj = new object();
private static S1 Value;
public static S1 Instance
{
get
{
if (Value == null)
{
lock (LocObj)
{
if (Value == null)
Value = new S1();
}
}
return Value;
}
}
}
- 懒汉式2 -- Lazy
public class S2
{
// 1. 私有化构造函数
public S2()
{
}
// 2. 提供静态实例
private static Lazy<S2> Value = new Lazy<S2>();
public static S2 Instance
{
get
{
return Value.Value;
}
}
}
- 懒汉式3 -- LazyInitializer
public class S3
{
// 1. 私有化构造函数
private S3()
{
}
// 2. 提供静态实例
private static S3 Value;
public static S3 Instance
{
get
{
return LazyInitializer.EnsureInitialized(ref Value, () => new S3());
}
}
}
- 饿汉式1 -- 静态变量
public class S4
{
// 1. 私有化构造函数
private S4()
{
}
// 2. 提供静态实例
public static readonly S4 Instance = new S4();
}
- 饿汉式2 -- 静态构造函数
public class S5
{
// 1. 私有化构造函数
private S5()
{
}
// 2. 提供静态实例
static S5()
{
Instance = new S5();
}
public static readonly S5 Instance;
}
三 技术模式
目前,项目中我主要使用第三种方式,饿汉式的方法提供单例。
四 存在问题
大家考虑一个问题,如何在不知道代码的情况下,判断单例是饿汉式的还是懒汉式的?
五 总结

浙公网安备 33010602011771号