代码之家  ›  专栏  ›  技术社区  ›  Hamish Grubijan

即使在使用.net4.0时,我仍然必须手工在.net中实现一个singleton类吗?

  •  3
  • Hamish Grubijan  · 技术社区  · 15 年前

    一旦理解了单例模式,用C语言编写随后的单例类是一个无脑的练习。我希望框架能够通过提供接口或基类来帮助您实现这一点。以下是我的设想:

    public sealed class Schablone : ISingleton<Schablone>
    {
        // Stuff forced by the interface goes here
    
        // Extra logic goes here
    }
    

    我要找的东西存在吗?

    构造一个单例类是否有一些语法上的糖分——是否有接口、类属性等?

    一个人能自己写一个有用且防弹的isingleton吗?想试试吗?

    谢谢!

    8 回复  |  直到 15 年前
        1
  •  1
  •   Community CDub    8 年前

    不,在.NET框架中没有类似的内容。你得自己写单件。为单例定义API有点困难,因为有很多实现它们的方法,并且取决于您的目标,取决于您将采用什么方法。

    我建议你读这个 article on singletons . (由 Jon -他是个聪明的人,听他说)在各种技巧上寻求指导和建议。它涵盖了一些大多数人可能没有想到的东西。

    [很多人认为单体模式是一种可疑的设计模式。我不会在这里讨论原因,但是如果你感兴趣的谷歌有很多信息。注意不要过度使用。]

        2
  •  4
  •   Jon Skeet    15 年前

    你发现自己多久写一次单人课?

    我建议,如果对你来说这是一个足够频繁的任务,你会觉得你正在失去生产力,那么你很可能会过度使用这个模式。我发现它非常 很少地 适当-但很容易导致难以测试的代码。

    用C语言写一个单件课程不仅仅是无脑的——几乎完全没有痛苦。如果你不需要的话,所需的锅炉板很小。 绝对的 懒惰到不应该仅仅通过调用其他静态方法来实例化单例的地步。

    public sealed class Singleton
    {
        private static readonly Singleton instance = new Singleton();
        public static Singleton Instance { get { return instance; } }
    
        private Singleton() {}
    
        // Omit if you don't care about type initializer laziness
        static Singleton() {}
    }
    

    显然,您无论如何都需要一个类声明,所以您已经保存了三行或四行,这取决于您是否需要静态构造函数。就我个人而言,我不认为这是如此费时,在罕见的情况下,单件是有效的,它值得成为框架的一部分。

    事实上,很难看出 框架 功能而不是 语言 特色…至少编译器必须意识到这一点,才能理解将有一些神奇的“实例”属性(或其他任何属性)可供调用方使用。

    正如EricLippert喜欢指出的(完全合理地,我可能会补充)语言特性在设计、实现和测试方面有很大的成本。此外,每个开发人员都有学习新语言特性的负担。简言之,他们需要真正地获得他们的价值——对我来说,是单身模式。 不是 足够有用和重要,它使酒吧。

        3
  •  3
  •   Matt Greer    15 年前

    有什么可以强迫的?单例可以用一个属性和一个字段来实现。对于任何框架开发人员来说,这里似乎没有一个非常好的价值/成本比。

    更不用说,单例模式通常是一个不好的模式,在我看来,让框架来推广它们是不好的。对我来说,单身几乎总是一种代码味道。

        4
  •  2
  •   Lucero    15 年前

    正如其他人和我(在评论中)所指出的,单例模式很少适用。

    尽管如此,由于一些人认为这不可行,下面是实现这种单例的帮助器类(受到有关如何实现单例的链接文章的启发):

    public static class Singleton<T> where T: class, new() {
        public static T Instance {
            get {
                return Nested.instance;
            }
        }
    
        private static class Nested {
            public static readonly T instance = new T();
    
            static Nested() {}
        }
    }
    

    要用作singleton的类需要有一个公共的默认构造函数。

    然后您可以使用它,如下所示:

    Singleton<MyClass>.Instance.DoSomething();
    
        5
  •  1
  •   Dirk Vollmar    15 年前

    我认为那是不可能的。

    接口如何禁止您向类中添加公共构造函数?

    毕竟,一旦您了解了基本模式(以及使其线程安全的注意事项),编写单例就没有那么多工作了。

        6
  •  1
  •   James Westgate    15 年前

    切。粘贴。下一步。

        7
  •  1
  •   Joshua Flanagan    15 年前

    使用反转控制容器为您管理它。

    StructureMap ,可以将任何类型声明为singleton:

    ObjectFactory.Initilialize(x => x.ForSingletonOf<Schablone>());
    

    检索它:

    ObjectFactory.GetInstance<Schablone>();
    
        8
  •  1
  •   pms1969    15 年前

    .NET 4.0附带MEF。您可以使用MEF来实例化一个单例。通过共享创建策略。我要找出一个代码示例…

    编辑----

    更好的是,这里有一些文件……

    http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=Guide