单例模式的定义:只能有一个实例,提供唯一公开、可访问实例的全局访问点
单例模式的三种实现方式:
示例1
private Singleton() { Console.WriteLine("{0}被构造,线程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId); }
private static Singleton m_Singleton = null;
public static Singleton CreateInstance() {
if (m_Singleton == null) {
//Thread.Sleep(1000); m_Singleton = new Singleton(); } return m_Singleton; }
优点:直到对象要求产生一个实例才执行实例化
缺点:线程不安全,并发执行时,如果尚未创建实例,会创建多个实例
示例2
private Singleton() { Console.WriteLine("{0}被构造,线程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId); } private static readonly Singleton m_Singleton = new Singleton(); public static Singleton CreateInstance() { return m_Singleton; }
优点:线程安全
缺点:静态初始化由CLR执行,缺少实例化机制的控制权 。在程序启动或第一次访问引用了类的任何成员时实例已经被创建。
示例3
private Singleton() { Console.WriteLine("{0}被构造,线程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId); } private static Singleton m_Singleton = null; private static readonly object m_Object = new object(); public static Singleton CreateInstance() {
//提高系统性能。锁会阻塞线程,对象被实例化后不再需要线程排队等待 if (m_Singleton == null) {
//保证锁住部分只有一个线程执行 lock (m_Object) {
//确保单线程时 对象只被创建一次 if (m_Singleton == null) { m_Singleton = new Singleton(); } } } return m_Singleton; }
优点:解决线程并发问题,将实例化延迟到第一次访问对象时发生
使用场景:系统的任务管理器,配置文件的读取,数据库连接池的设计,多线程的线程池设计,应用程序的日志应用等。
说到这里有人会问:
1.有了静态类,为什么还要有“单例”?
静态类是一种语法,而单例模式是一种思想。
静态类不可以继承类或实现接口。
静态类中不能声明实例成员。即静态类中所有的字段,属性,方法等都必须是静态的。
无法控制静态成员的初始化。
设计模式是前人不断尝试、改进后提炼出来的思想。但我们不要生搬硬套,适合的才是最好的。在此,关于单例模式的学习到此结束。谢谢您的阅读
由于博主能力有限,文中可能存在不正确的地方,欢迎斧正,补充。