其实工作中一直在使用单例模式但是一直没留意过,有空简单总结一下。
单例模式的要点有三个:
1、是某个类只能有一个实例。
2、是它必须自行创建这个实例。
3、是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:
1、是单例模式的类只提供私有的构造函数。
2、是类定义中含有一个该类的静态私有对象。
3、是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
举例代码实现:
最简单直接的单例
public class Singleton { private static Singleton instance; /// <summary> /// 构造方法私有,外键不能通过New类实例化此类 /// </summary> private Singleton() { } /// <summary> /// 此方法是本类实例的唯一全局访问点 /// </summary> /// <returns></returns> public static Singleton GetInstance() { //如实例不存在,则New一个新实例,否则返回已有实例 if (instance == null) { instance = new Singleton(); } return instance; } }
多线程安全
public class Singleton { private static Singleton instance; /// <summary> /// 程序运行时,创建一个静态只读的进程辅助对象 /// </summary> private static readonly object _object = new object(); /// <summary> /// 构造方法私有,外键不能通过New类实例化此类 /// </summary> private Singleton() { } /// <summary> /// 此方法是本类实例的唯一全局访问点 /// (双重加锁 Double-Check Locking) /// </summary> /// <returns></returns> public static Singleton GetInstance() { //先判断实例是否存在,不存在再加锁处理 if (instance == null) { //在同一时刻加了锁的那部分程序只有一个线程可以进入, lock (_object) { //如实例不存在,则New一个新实例,否则返回已有实例 if (instance == null) { instance = new Singleton(); } } } return instance; } }