单例模式——保证一个类仅有一个实例,并提供一个访问它的全局访问点
单例模式是为了解决全局只允许存在一个实例,防止出现多个实例扰乱程序的正常的运行,单例模式不是一个时刻都需要运用的模式,是情非得已下才使用的
它在多线程的条件下使用时必须要加锁才行,这样就造成了两种实现方式,分为“饿汉式”和“懒汉式”。
“饿汉式”单例的实现,饿汉式的实现方式在于静态初始化时就自己实例化了自己,不需要外部进行初始化,提前占用资源。、
1.创建一个单例类,定义为sealed不可继承,并且在初始化的时候就自己创建了一个实例,外部调用时将这个实例返回回去。
1 /// <summary> 2 /// 定义这个类不可继承 3 /// </summary> 4 public sealed class Singleton 5 { 6 //定义一个静态实例,当初始化时就将自己实例化 7 //readonly该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中 8 private static readonly Singleton Instance=new Singleton(); 9 10 /// <summary> 11 /// 改造该类的构造方法 12 /// 不允许外部实例化 13 /// </summary> 14 private Singleton() 15 { 16 } 17 18 /// <summary> 19 /// 给外部一个实例化对象的方法 20 /// 当对象存在时,直接返回对象 21 /// </summary> 22 /// <returns></returns> 23 public static Singleton GetInstance() 24 { 25 return Instance; 26 } 27 }
“懒汉式单例”时自己不创建自己的实例,当第一个给外部调用的时候才创建实例,以后再次调用的时候,判断是否为Null,不为null就返回前面创建的实例,当然,为了解决多线程并发的问题,创建时需要加锁。
2.创建一个单例,定义一个实例,并创建一个锁,提供给外部一个获得实例的方法,方法里面进行非空验证,为空则加锁创建实例。
1 public class Singleton 2 { 3 /// <summary> 4 /// 定义一个静态实例 5 /// </summary> 6 private static Singleton _instance; 7 8 /// <summary> 9 /// 创建一个锁 10 /// </summary> 11 private static readonly object SyncRoot=new object(); 12 13 /// <summary> 14 /// 将构造方法改为私有的,不允许外部调用并且实现new 15 /// </summary> 16 private Singleton(){} 17 18 /// <summary> 19 /// 提供一个给外部获得实例的方法 20 /// </summary> 21 /// <returns></returns> 22 public static Singleton GetInstance() 23 { 24 //判断是否为null 25 if (_instance==null) 26 { 27 //加锁创建实例 28 lock (SyncRoot) 29 { 30 //再进行一次非空判断是防止两个进程同时通过了非null判断 31 //另一个在排队,就会造成再一次创建实例 32 if (_instance==null) 33 { 34 _instance=new Singleton(); 35 } 36 } 37 } 38 return _instance; 39 } 40 }
以上内容部分参考程杰的《大话设计模式》一书