[转]C#下的单例实现

上一篇 / 下一篇  2010-05-03 11:22:29 / 个人分类:设计模式

C#下的单例实现

开发者在线 Builder.com.cn 更新时间:2007-11-11作者:佚名 来源:论坛整理

本文关键词: C# 单例实现

 本文介绍了C#下关于单例的三种实现方法。

  最普通的一种:51Testing软件测试网 ac-ZS)V

51Testing软件测试网D2M8igUcs

以下是引用片段:
:NYG zX"Wd;t \0  using System; 
K%Uh w.t0  public class Singleton 
{/P/_t,pRs l0  { 51Testing软件测试网rv`#kX;{8RJ? {,RJt
  private static Singleton instance; 51Testing软件测试网6u'R%AH.n~K-t,z h
  private Singleton() {} 
zXW{5?T6k0  public static Singleton Instance 51Testing软件测试网 _R0\)p| F w6h
  { 51Testing软件测试网KwfCd1Y#pC
  get 51Testing软件测试网f)Hi S;ylz
  { 51Testing软件测试网+Q/lo`z`7[?
  if (instance == null) 51Testing软件测试网\b3u7_;byznK+J5A
  instance = new Singleton(); 
*?-A8d7u6Y$[X}D0  return instance; 51Testing软件测试网(snbZ2hL}+k
  } 
7o%]5ET d"g{Hw0  } 51Testing软件测试网vG+G$~'Ufy,Y,K
  }

dg)EXc7Y0

  这种方案在.Net下面是线程不安全的,每个线程进来会创建不同的类型实例。51Testing软件测试网8aL_+R4@:RW9w%]

  下面是一种在.Net公共语言运行环境下的线程安全单例实现模式:51Testing软件测试网M-Q th w*[.U

N:VBM t)Kx)@ X0
以下是引用片段:51Testing软件测试网CU\/o[W)Fd&Y
  public sealed class Singleton 51Testing软件测试网)G:^bX yq fefy
  { 51Testing软件测试网'tD4_{(Q4^V?e
  private static readonly Singleton instance = new Singleton(); 51Testing软件测试网G5`'xQN|
  private Singleton(){} 
!S/s,|[E0  public static Singleton Instance 51Testing软件测试网7a:[(oY#\T:{i
  { 
8J W p"n7YOhl0  get 51Testing软件测试网[9oSY C(Q%T
  { 
!})Q#M4_}4p2Xg)[0  return instance; 
#j~#L0}4Z3?2Qs0  } 
7H)JzZ?u0  } 51Testing软件测试网`!pBk.V0d@Gj
  }

51Testing软件测试网N LH6Oe)Y

  它是依靠公共语言运行时的能力来构造的线程安全模式,在别的语言环境中是不适用的。51Testing软件测试网 C-hl_OtL$^ ml4k Jr

  基于此加上.Net对泛型的支持,我们可以做一个通用的泛型单例Provider, 代码如下:

$U!j_Zn"x4vsnEFQ0

51Testing软件测试网 [%T8j8O"@-\M

以下是引用片段:
^eH,Q%H?(Np+J0  public class SingletonProvider where T : new() 
U2_"c!c W1p;R;`&N0  { 
2t#K[gYB+n0  SingletonProvider()  
R7d \-c2F0  public static T Instance 51Testing软件测试网2Kz Dl x*],y
  { 
wP/do9Ce-S7n e0  get  51Testing软件测试网6]*z I,o-u;a-]
  } 51Testing软件测试网 XI)A%Tu R*z3c4T
  class SingletonCreator 
&d\av X0  { 51Testing软件测试网(Qi W+t)}F&{rs(H
  static SingletonCreator()  
jn0Q w$JGr0  internal static readonly T instance = new T(); 
)so*h.II%{f ~9ok0  } 51Testing软件测试网)qE{8JP,e'L6` d8j
  }

51Testing软件测试网gi2pU a&TB2Y,J

  在此应用下,单例的实例由CLR保证只在首次引用它时才会被创建。

\m:P5a,A k+@0

  当它不能满足需要时,比如:你需要在构造函数中做一些其它的操作完成初始化的话,那么就可以考虑使用Double-checked locking模式来实现。51Testing软件测试网]gSg}B

  一个线线程安全的单例:

b\W+}T;^0

%q+ot1d.a bD#_*|0
以下是引用片段:51Testing软件测试网x O]lE+r4U U
  using System; 
DEO(DjY)y0  public sealed class Singleton 
'g$|;ao!} Q+Q(@0  { 51Testing软件测试网q0c0v W |0PO&i
  private static volatile Singleton instance; 
7y|*f(jI!N(]:Cj0  private static object syncRoot = new Object(); 51Testing软件测试网8D*}9N;?yW5O
  private Singleton() {} 
i2F1W3ton x*w0  public static Singleton Instance 51Testing软件测试网3_3J`!DW7p
  { 
Ibm9} h/v0  get 
? fI+P+sw dB0d0  { 51Testing软件测试网#In%{$XK.t
  if (instance == null) 51Testing软件测试网,DfQ1n6l9L4F/T9w
  { 
g0pIXG0SK4j0  lock (syncRoot) 
'T%b yTTS*[,TT0  { 51Testing软件测试网ky$_`[w
  if (instance == null) 51Testing软件测试网6Q j,Mw|:^
  instance = new Singleton(); 
:O-[9GrP3q'w0  } 
`Zklz2B9w0  } 51Testing软件测试网F|`$~`;Z;^
  return instance; 
4j$P2N A7e:DM y k)m7Q0  } 51Testing软件测试网&Q&R!v#N4~+m
  } 
A6oFD M$}O9\X"i)c0  }

51Testing软件测试网y5XVd hE

  需要注意的时,这里锁定的是syncRoot,而不是本身,这可以避免产生死锁。51Testing软件测试网)m:AF6NS.Ql*l

  在其它的语言环境中,Double-Checked Locking不一定能正常工作,这是由于编译器本身的问题产生的,所以上面的实现方法并不一定适用于其它的语言环境。

9\}a-~qZ&i1g8l0

TAG:

 

评分:0

我来说两句

Open Toolbar