2009-12-23 56 views
0

是否有可能在C#中的非单例类中嵌套单例类,如果是这样,在这种情况下单例的生命周期是否有任何限制?嵌套的单例类

public class NonSingletonClass 
{ 
    public NonSingletonClass() 
    { 
    // Initialize some stuff. 
    } 

    // Put some methods here. 

    public class SingletonClass 
    { 
    // Singleton construction goes here. 

    // Put some methods here. 
    } 
} 

在我的应用程序的设计中,这是有道理的,但在实际执行此操作之前,我需要知道任何潜在的陷阱。

编辑:具体来说,我有一个基于计时器执行任务的工作主机。这种情况下的NonSingletonClass是任务的实例。 SingletonClass是由NonSingletonClass使用的数据存储库,但可以从NonSingletonClass以外的地方进行修改。存在SingletonClass以确保即使存在多个NonSingletonClass实例,仍然只有一组指令和数据适用于所有这些实例。

回答

2

我相信你正在寻找的Monostate模式

这个链接就是一个很好的说明,并提供contrats用Singleton模式 monostate pattern

+0

很好的参考,'SingletonClass'中的变量实例是否仍然存在于NonSingletonClass的实例之外? – 2009-12-23 17:58:48

+0

@ md5sum - 是 (15个字符) – JonH 2009-12-23 18:02:13

4

是,单身生活可以完全舒适内的非单身。

嵌套类的生命周期完全独立于外部类的生命周期。 C#中嵌套类和非嵌套类之间几乎没有区别。 (有一些的差异 - 嵌套类可以访问外部类的私有成员,例如扩展方法必须位于非嵌套静态类中 - 但它不会影响生命周期。

你有没有特别的关注?

+0

我担心的是,如果在我的'NonSingletonClass'实例中发生了可怕的错误,那么我的'SingletonClass'继续响应NonSingletonClass'外部调用而没有问题。 – 2009-12-23 18:01:40

+0

是的,他们完全独立,好像他们是分开的班级。 – 2009-12-23 18:03:38

0

我想我的第一个问题是你能否给我们更多的细节考虑你陈述的“我的应用程序的设计这是有道理的。”抽象工厂和建设者只是一些模式,使用singleton classes。是否存储某些要在NonSingletonClass中使用的全局数据。

0

我不认为有什么问题考虑到任何一个阶级都没有提到另一个阶级,所以是一个嵌套的单身人士。考虑到你说单例为多个实例提供了可变数据存储,我认为你的潜在问题将会是并发性相关的。

这些只适用于允许多线程访问的情况,也就是说,首先我们必须确保适当的锁定,以使单例始终处于有效状态。其次,如果单体状态正在改变并且对象以非确定性顺序访问,则结果将不可预测(即竞态条件)。

如果并发不是应用程序的问题,我发现使用私有嵌套类是隐藏实现细节并确保每个对象只有一个角色的绝佳方式。