第一式、单例模式-Singleton模式(建立型)

1、简介

单例模式主要用的做用是用于保证程序运行中某个类只有一个实例,并提供一个全局入口点。单例模式(Singleton)为GOF阐述的标准24种设计模式中最简单的一个。但随着时间推移,GOF所阐述的单例实现已不能彻底知足实际应用。html

"ensure a class has only one instance, and provide a global point of access to it"设计模式

2、动机(应用场景)

几乎在每一个应用程序中,都须要有一个从中进行全局访问和维护某种类型数据的区域。 在面向对象的 (OO) 系统中也有这种状况,在此类系统中,在任何给定时间只应运行一个类或某个类的一组预约义数量的实例。安全

一、当使用某个类来维护增量计数器时,此简单的计数器类须要跟踪在多个应用程序领域中使用的整数值。 此类须要可以增长该计数器并返回当前的值。 对于这种状况,所需的类行为应该仅使用一个类实例来维护该整数,而不是使用其它类实例来维护该整数。
二、每台计算机能够有若干个打印机,但只能有一个Printer Spooler,避免两个打印做业同时输出到打印机。
三、PC机中可能有几个串口,但只能有一个COM1口的实例。
四、系统中只能有一个窗口管理器。
5.NET Remoting中服务器激活对象中的Sigleton对象,确保全部的客户程序的请求都只有一个实例来处理。
6.应用程序的日志应用,通常都何用单例模式实现,这通常是因为共享的日志文件一直处于打开状态,由于只能有一个实例去操做,不然内容很差追加。服务器

3、C#实现

一、单线程实现多线程

单线程单例模式实现

能够说是一个标准的单例的代码。并发

优势:ide

  • 因为实例是在 Instance 属性方法内部建立的,所以类可使用附加功能(例如,对子类进行实例化),即便它可能引入不想要的依赖性。函数

  • 直到对象要求产生一个实例才执行实例化;这种方法称为"懒实例化"。懒实例化避免了在应用程序启动时实例化没必要要的 singleton优化

缺点:this

      多线程环境下它是不安全的。若是执行过程的不一样线程同时进入 Instance 属性方法,那么可能会建立多个 Singleton 对象实例。每一个线程都会执行下列语句,并决定必须建立新的实例。

二、多线程实现

多线程单例模式实现

 

优势:因为实例的产生由本身控制,能够对非默认构造函数进行扩展、传参等操做。

缺点:实现相对复杂

三、C#简洁版

因为 C# 与公共语言运行库也提供了一种"静态初始化"方法,这种方法不须要开发人员显式地编写线程安全代码,便可解决多线程建立等问题。

 

简洁实现1

更简洁的方式:

简洁实现1

 

由于静态构造函数是属于类的,而不属于任何一个实例,因此这个构造函数只会被执行一次,并且是在建立此类的第一个实例或引用任何静态成员以前,由.NET自动调用。

一、因为静态构造函数由.NET调用,因此不须要public和private等访问修饰符。

二、在建立第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类。(咱们没法调用,也不知道它什么时候被调用)

三、静态构造函数属于类,构造函数属于实例,他们并不冲突。静态构造函数只会运行一次。

 

缺点:因为在此解决方案中由 .NET Framework 负责执行初始化,没法在实例化以前使用非默认的构造函数或执行其余任务。在大多数状况下,静态初始化是在.NET 中实现 Singleton 的首选方法。

4、总结

单线程版、多线程版、简洁版有各自的应用,没有那种实现是最好的。

总结上述三种实现方法,以是否须要在建立单例实例时传参或执行其余任务分两类。即:

一、不须要执行其余任务

使用简洁版便可以保障在单线程、多线程都能安全使用的同时,代码量较少。

二、须要

通常状况下,均为单线程版。则使用单线程建立。若程序有多线程应用则应用使用双重检测的多线程实现。

 

 

参考文档:

http://msdn.microsoft.com/zh-cn/library/ff650316.aspx

http://terrylee.cnblogs.com/archive/2005/12/09/293509.html

相关文章
相关标签/搜索