避免在单身人士中进行不必要的重新计算

时间:2015-07-08 13:59:47

标签: c# initialization singleton

考虑以下C#单例类和所述类的客户端

class TheSingleton
{
    TheSingleton() { /* initialize properties x, y, z */ }
    public static TheSingleton Instance() { /* classic Singleton implementation */ }
    public void Refresh() { /* refreshes properties x, y, z */ }
}

class TheClient
{
    static void SomeWork()
    {
        /* ... does some updates that means that TheSingleton's properties have to be refreshed */
        TheSingleton.Instance().Refresh();
    }
}

情景1

  • 调用TheSingleton.Instance()初始化x,y和z
  • 一段时间后TheClient.SomeWork()被称为
  • 调用
  • TheSingleton.Instance().Refresh()来刷新x,y和z
  • 一切都很酷

情景2

  • 没有致电TheSingleton.Instance()
  • 调用
  • TheClient.SomeWork()调用TheSingleton.Instance().Refresh();
  • TheSingleton.Instance()TheSingletonTheSingleton构造函数初始化x,y和z
  • Instance()返回后立即SomeWork()调用Refresh(),这是浪费处理,因为x,y和z刚刚初始化。
  • 一切都不再酷了

在场景2中,有哪些优雅方法可以避免重新计算x,y和z?

谢谢,皮特

1 个答案:

答案 0 :(得分:1)

我同意那些声明你滥用单身人士模式的评论。

不幸的是,代码示例不完整,因此无法完全理解该方案。但...

如果单例中的 only 事物是那些需要刷新的值,那么显然这个对象应该是一个单例。您应该只要求调用者在任何时候创建一个新实例,然后刷新"。

如果你把它变成单身,因为 某些东西是不变的并且可以/应该被共享,那么你仍然不应该让公共对象本身成为单身。相反,使用单例作为实现的一部分;即管理不变部分的private static成员,而单个实例包含可能需要刷新的数据。在此设计中,您将再次要求调用者创建一个新实例,以便"刷新"。

请注意,您可以在非单例实现中包含Refresh()方法。但是,我会建议不要这样做。它不必要地会使API的设计复杂化。此外,如果你不允许"刷新"在对象本身上,您可以使对象不可变,如果在多线程场景中使用代码,这将带来好处。