1.定义
Ensure a class has only one instance,and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)
2.模式讲解
(1)类图
(2)单例模式通用代码
1 public class Singleton 2 { 3 private static Singleton singleton = new Singleton(); 4 5 private Singleton() 6 {} 7 8 public static Singleton GetSingleton() 9 { 10 return singleton; 11 } 12 }
3.单例模式的多种实现方式
(1)简单的实现
public sealed class Singleton { private static Singleton _instance = null; private Singleton() { } public static Singleton Instance { get { if (_instance == null) { _instance = new Singleton(); } return _instance; } } }
缺点:这种方式的实现对于线程来说并不是安全的,因为在多线程的环境下有可能得到Singleton类的多个实例。
优点:直到对象要求产生一个实例才执行实例化;这种方法称为“惰性实例化”。惰性实例化避免了在应用程序启动时实例化不必要的 singleton。
(2)安全的线程
public sealed class Singleton { private static Singleton _instance = null; private static readonly Object O = new object(); private Singleton() { } public static Singleton Instance { get { lock (O) { if (_instance == null) { _instance = new Singleton(); } return _instance; } } } }
优点:这种方式的实现对于线程来说是安全的。我们首先创建了一个进程辅助对象,线程在进入时先对辅助对象加锁然后再检测对象是否被创建,这样可以确保只有一个实例被创建,因为在同一个时刻加了锁的那部分程序只有一个线程可以进入。这种情况下,对象实例由最先进入的那个线程创建,后来的线程在进入时(instence == null)为假,不会再去创建对象实例了。
缺点:这种实现方式增加了额外的开销,损失了性能。
(3)静态初始化,饿汉式单例模式(在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快)
public sealed class Singleton { private static readonly Singleton singleton = new Singleton(); private Singleton() { } public static Singleton GetSingleton() { return singleton; } }