单例模式的静态实现

13-02-07 anyedage
看李会军的帖子:http://www.cnblogs.com/Terrylee/archive/2005/12/09/293509.html

对静态初始化不理解,不明白为什么要搞这么复杂。

这是我的实现:

public class Singleton

{

static Singleton instance = new Singleton();

Singleton()

{

}

public static Singleton GetInstence

{

get { return instance; }

}

}

请问这个有什么缺点?

李会军的原文如下:

1public sealed class Singleton

2{

3 static readonly Singleton instance=new Singleton();

4

5 static Singleton()

6 {

7 }

8

9 Singleton()

10 {

11 }

12

13 public static Singleton Instance

14 {

15 get

16 {

17 return instance;

18 }

19 }

20}

21

看到上面这段富有戏剧性的代码,我们可能会产生怀疑,这还是Singleton模式吗?在此实现中,将在第一次引用类的任何成员时创建实例。公共语言运行库负责处理变量初始化。该类标记为 sealed 以阻止发生派生,而派生可能会增加实例。此外,变量标记为 readonly,这意味着只能在静态初始化期间(此处显示的示例)或在类构造函数中分配变量。

该实现与前面的示例类似,不同之处在于它依赖公共语言运行库来初始化变量。它仍然可以用来解决 Singleton 模式试图解决的两个基本问题:全局访问和实例化控制。公共静态属性为访问实例提供了一个全局访问点。此外,由于构造函数是私有的,因此不能在类本身以外实例化 Singleton 类;因此,变量引用的是可以在系统中存在的唯一的实例。

由于 Singleton 实例被私有静态成员变量引用,因此在类首次被对 Instance 属性的调用所引用之前,不会发生实例化。

这种方法唯一的潜在缺点是,您对实例化机制的控制权较少。在 Design Patterns 形式中,您能够在实例化之前使用非默认的构造函数或执行其他任务。由于在此解决方案中由 .NET Framework 负责执行初始化,因此您没有这些选项。在大多数情况下,静态初始化是在 .NET 中实现 Singleton 的首选方法。

         

banq
2013-02-07 21:01
严格来说,。单例模式不是真正模式,其各种非人道写法都是为cpu而写,保证线程单一性,不同语言因为和cpu亲疏不一,差别很大。不必拘束于细节。

猜你喜欢