首页 新闻 会员 周边

单例模式的静态实现

0
悬赏园豆:20 [已解决问题] 解决于 2013-02-10 17:33

看李会军的帖子: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 的首选方法。

日暮乡关何处是的主页 日暮乡关何处是 | 初学一级 | 园豆:84
提问于:2013-02-07 17:02
< >
分享
最佳答案
0

你两不是 一样的吗 ?

收获园豆:20
Qlin | 老鸟四级 |园豆:2403 | 2013-02-07 17:40

不是啊,我的类不需要sealed啊

日暮乡关何处是 | 园豆:84 (初学一级) | 2013-02-07 17:44

@暗夜娜姐: 构造函数私有化了,可以不要sealed 了。

另外 你的 应该加上 readonly,不加的话,还是可以改变的,如:

 public class Singleton
    {
        static  Singleton instance = new Singleton();

        Singleton()
        {
        }

        public static Singleton GetInstence
        {
            get { return instance; }
        }

        public void ReCreate()
        {
            instance = new Singleton();
        }
    }

// Singleton.GetInstence.ReCreate();

你可能会说 不会写这样的方法,但是 使用instance 实例是会操作很多方法的,还是在技术上加上,而不是 希望别人不要这样写。

Qlin | 园豆:2403 (老鸟四级) | 2013-02-07 17:57

@Qlin: 说的好,我明白了,多谢

日暮乡关何处是 | 园豆:84 (初学一级) | 2013-02-10 17:32
其他回答(1)
0

他应该说了很清楚 从多线程方面考虑

Yu | 园豆:12980 (专家六级) | 2013-02-08 10:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册