【问题标题】:Nested Singleton Class嵌套单例类
【发布时间】:2009-12-23 17:51:26
【问题描述】:

是否可以在 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 是任务的实例化。 SingletonClassNonSingletonClass 使用的数据存储库,但可以从NonSingletonClass 外部进行修改。 SingletonClass 的存在是为了确保即使有多个 NonSingletonClass 实例,它们仍然只有一组指令和数据。

【问题讨论】:

    标签: c# singleton nested nested-class


    【解决方案1】:

    是的,单身人士可以在非单身人士中完全舒适地生活。

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

    您有具体的问题吗?

    【讨论】:

    • 我担心的是,如果我的NonSingletonClass 实例出现严重错误,我的SingletonClass 会继续无故障地响应来自外部NonSingletonClass 的呼叫。
    • 是的,它们是完全独立的,就好像它们是独立的类一样。
    【解决方案2】:

    我相信您正在寻找单态模式

    此链接对此进行了很好的描述,并提供了与单例模式的对比 monostate pattern

    【讨论】:

    • 很好的参考,SingletonClass 中的变量实例是否仍然存在于NonSingletonClass 的实例化之外?
    【解决方案3】:

    我想我的第一个问题是考虑到您所说的“我的应用程序的设计是有意义的”,您能否给我们提供更多细节。抽象工厂和构建器只是使用单例类的一些模式。您是否存储某种全局数据以在 NonSingletonClass 中使用。

    【讨论】:

      【解决方案4】:

      考虑到两个类都没有对另一个类的引用,我认为嵌套单例没有任何问题。考虑到您说单例为多个实例提供可变数据存储,我认为您的潜在问题将与并发相关。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多