代码之家  ›  专栏  ›  技术社区  ›  Alex

单例设计模式是否内置于任何框架中?

  •  1
  • Alex  · 技术社区  · 16 年前

    使用singleton类可以保证类的一个实例将控制权交给程序员。真的很有用。

    我想知道,例如,给定框架中是否存在一个单独的接口,以绕过显式创建/添加一个接口的需要?

    贴花方便:

    public sealed class MySingleton : ISingleton  //or a different class 
        { ... }
    

    然后期望类只被实例化一次。

    这是个好主意,还是我有点偏离目标?:)

    9 回复  |  直到 14 年前
        1
  •  8
  •   BalusC    16 年前

    我想知道,例如,给定框架中是否存在一个单独的接口,以绕过显式创建/添加一个接口的需要?

    它不存在也不可能存在。单件基本上需要 static Singleton getInstance() 方法,但因为 static 无法将其定义为抽象(接口)方法。这也是有道理的,只有 单例实现,而不是多个。抽象它是毫无意义的。

    你需要自己把完整的单件衣服煮沸。不过,我非常怀疑这是如何有用的。当然,它并不是防止stackoverflow或内存错误的唯一目的。写作 好的 代码阻止了这一点。只有当您想让最终用户处理 相同的 一直都是实例。顺便说一下,如果没有单件模式,也可以做得很好。要么直接申报 静止的 或者利用平均框架提供的“应用范围”概念。

    而不是单身,而是寻找 inversion of control (依赖注射)。顺便说一句,春天也在这样做。他们不使用“纯”单件。这是他们做出的一个糟糕的选择。

    参见:

        2
  •  2
  •   bwawok    16 年前

    singleton并不能防止堆栈溢出,也不能确定用它能得到什么。

    对于Java,想到的是Spring。默认情况下,您所写的每个SpringBean都是单例的。您可以在100个地方使用它,它们都将通过注入自动设置,并且所有100个引用都将指向同一个对象(即单例对象)。在Spring中设置项目时,只需遵循约定,就可以生成任何需要单例的类。

        3
  •  2
  •   harto    16 年前

    GoogleGuice是一个支持 @Singleton 注释。

    注意用注释的类 @ Singleton 不是“真的”单例程序——没有什么能阻止客户端代码创建这样一个类的许多实例。但是,guice管理的依赖项将共享同一个实例。

    http://code.google.com/p/google-guice/wiki/Scopes

        4
  •  1
  •   Dagg Nabbit    16 年前

    也许不是你要找的,但这是我最喜欢的C单子模式版本。它是线程安全的,使用懒惰的实例化,不需要任何锁。写作也很轻松…不需要框架。;)

    class MyClass
    {
      // ...
      #region Singleton pattern
      private MyClass() { }
      public static MyClass Instance { get { return Singleton.instance; } }
      class Singleton
      {
        static Singleton() { }
        internal static readonly MyClass instance = new MyClass();
      }
      #endregion
      // ...
    }
    

    要获取对象实例:

    MyClass m = MyClass.Instance;
    
        5
  •  1
  •   Peter Lawrey    16 年前

    在爪哇中,可以简单地使用枚举类型来实现这一点。您可以指定实例的数量,这样就可以选择不存在实例(也称为实用程序类)、一个实例(也称为单实例)或多个实例。

    public enum MySingleton {
        INSTANCE;
    } 
    
        6
  •  1
  •   Olivier Dagenais    16 年前

    .NET 4.0具有 Lazy(T) Class ,它将以线程安全的方式在第一次访问时延迟初始化值。有很多例子 Lazy Initialization 话题。

    另外,如果您正在使用 Unity 有一个 lifetime manager 您可以使用 ContainerControlledLifetimeManager 以确保单个实例。

        7
  •  1
  •   tgandrews    16 年前

    Ruby有一个名为 singleton 这使得包含它的类成为一个单例。此模块内置于标准库中。

        8
  •  0
  •   raja kolluru    16 年前

    单例模式背后的意图是“配置一次”。多次使用”。这通常用于共享上述答案之一中提到的任何类型的数据或资源。但启用任何类型的“管理”应用程序也很有用。(如果JMX是Java)

    您有一个特定类的实例,可以多次使用。由于只有一个实例,通过适当地配置该实例,您可以在整个应用程序中反映配置更改。因此,singleton模式能够为应用程序启用“管理仪表板”。

    Spring或Spring.net(Spring的.NET实现)对于配置和注入单例非常有用。同样的参数也适用于任何类型的依赖注入框架。您应该阅读有关依赖注入的一般信息,以充分利用其功能。跨多个JVM或集群的真正的单例通常难以创建和管理。可能需要工具支持。实际上,不需要创建和维护它。

    别把单件和静力学混淆了!这个构造看起来很相似,但可能非常不同。现在我要自吹自擂了! Here 是一个链接,指向一篇关于静态方法的文章。

        9
  •  0
  •   user1339260    14 年前
    public class Singleton<T> where T : class, new()
    {
        static class SingletonCreator
        {
            internal static readonly T instance = new T();
        }
    
        public static T Instance
        {
            get
            {
                return SingletonCreator.instance;
            }
        }
    }
    

    它既懒惰又多才多艺。根据需要定义构造函数。