使用Singleton类可以保证类的一个实例可以控制程序员。真有用。
我想知道在给定的框架中是否存在Singleton接口以绕过显式创建/添加一个的需要?
decalre会很方便:
public sealed class MySingleton : ISingleton //or a different class
{ ... }
然后期望该类只被实例化一次。
这是一个好主意,还是我的想法有点偏离? :)
答案 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管理的依赖项将共享同一个实例。
答案 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;
}
}
}
这是懒惰和多才多艺。按需定义构造函数。