设计模式:单例模式
单例模式是用来保证进程中,某个类只有一个实例。因为有时候某个类很占用资源,例如:数据库连接、或者是类在构造的时候很耗费资源和时间。
单例模式的实现分为两种:饿汉式和懒汉式。前者是在静态构造函数执行时就立即实例化,后者是在程序执行过程中第一次需要时再实例化。
懒汉式
/// <summary>
/// 懒汉式
/// </summary>
public class Singleton
{
private Singleton() //私有化构造函数,避免外部创建
{
long lResult = 0;
for (int i = 0; i < 1000000; i++)
{
lResult += i;
}
Thread.Sleep(2000);
Console.WriteLine($"{this.GetType().Name}被构造一次!");
}
/// <summary>
/// 静态变量 (定义成静态变量,保障全局唯一)
/// </summary>
private static volatile Singleton _singleton = null; //volatile 促进线程安全
private static object sinletonLock = new object();
/// <summary>
/// 公开的静态方法提供对象实例
/// </summary>
/// <returns></returns>
public static Singleton CreateInstance()
{
//解决多线程调用时线程不在进行加锁然后进行判断。
if (_singleton == null)
{
lock (sinletonLock)
{
//保证只被实例化一次
if (_singleton == null)
{
_singleton = new Singleton();
}
}
}
return _singleton;
}
}
懒汉式单例主要包括三部分:
1.私有化构造函数,避免外部创建。
2.公开的静态方法提供对象实例。
3. 静态变量 (定义成静态变量,保障全局唯一)。
饿汉式
public class Singleton
{
private static readonly Singleton _instance;
static Singleton()
{
_instance = new Singleton();
}
public static Singleton Instance
{
get
{
return _instance;
}
}
}
饿汉式是在静态构造函数中立即进行实例化。注意,为了确保单例性,需要使用 readonly 关键字声明实例不能被修改。
以上写法可简写为:
public class Singleton
{
private static readonly Singleton _instance = new Singleton();
public static Singleton Instance
{
get
{
return _instance;
}
}
}
在 C# 7 中还可以进一步简写,一句代码就搞定了,此写法如下:
public class Singleton
{
public static Singleton Instance { get; } = new Singleton();
}

浙公网安备 33010602011771号