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

时间:2010-07-13 02:22:18

标签: c# java frameworks singleton

使用Singleton类可以保证类的一个实例可以控制程序员。真有用。

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

decalre会很方便:

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

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

这是一个好主意,还是我的想法有点偏离? :)

9 个答案:

答案 0 :(得分:8)

  

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

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

你需要自己编写完整的单例。然而,我高度质疑这是如何有用的。它当然不是防止堆栈溢出或内存错误的唯一目的。编写好的代码可以防止这种情况发生。单例只有在您希望最终用户始终处理相同的实例时才有用。顺便说一句,没有单身模式,这可以做得很好。要么声明它static,要么使用平均框架可以为您提供的“应用程序范围”概念。

而不是单身,而是寻找inversion of control(依赖注射)。这也是Spring正在做的事情。他们不使用“纯粹的”单身人士。这是他们做出的一个糟糕的词语选择。

另见:

答案 1 :(得分:2)

Singleton不会阻止堆栈溢出,也不确定你使用它是什么。

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

答案 2 :(得分:2)

Google Guice是一个依赖注入框架,支持@Singleton注释。

请注意,使用@Singleton注释的类不是“真正的”单例 - 没有什么能阻止客户端代码创建此类的许多实例。但是,Guice管理的依赖项将共享同一个实例。

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

答案 3 :(得分:1)

也许不是你想要的,但这是我最喜欢的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;

答案 4 :(得分:1)

在Java中,您只需使用枚举类型即可。您可以指定实例数,以便在您选择时可以没有(也称为实用程序类),一个(也称为单例)或更多。

public enum MySingleton {
    INSTANCE;
} 

答案 5 :(得分:1)

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

此外,如果您使用Unity,则可以使用ContainerControlledLifetimeManager配置lifetime manager以确保单个实例。

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

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

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

不要将单身人士与静电混淆!该构造看起来很相似,但它可能非常不同。现在鼓点我自己的小号! Here是我撰写的关于静态方法的文章的链接。

答案 8 :(得分:0)

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;
        }
    }
}

这是懒惰和多才多艺。按需定义构造函数。