设计模式:单例模式
单例模式是用来保证进程中,某个类只有一个实例。因为有时候某个类很占用资源,例如:数据库连接、或者是类在构造的时候很耗费资源和时间。
单例模式的实现分为两种:饿汉式和懒汉式。前者是在静态构造函数执行时就立即实例化,后者是在程序执行过程中第一次需要时再实例化。
懒汉式
////// 懒汉式 /// 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}被构造一次!"); } ////// 静态变量 (定义成静态变量,保障全局唯一) /// private static volatile Singleton _singleton = null; //volatile 促进线程安全 private static object sinletonLock = new object(); ////// 公开的静态方法提供对象实例 /// ///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();
}