繁体   English   中英

避免单例不必要的重新计算

[英]Avoiding unnecessary recomputation in singletons

考虑以下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()新增了TheSingleton ,并且TheSingleton构造函数初始化x,y和z
  • Instance()返回后, SomeWork()调用Refresh() ,因为x,y和z仅被初始化,因此这是浪费的处理。
  • 一切不再酷

在方案2中,有什么优雅的方法可以避免重新计算x,y和z?

谢谢,皮特

我同意指出您正在滥用单例模式的评论。

不幸的是,该代码示例是不完整的,因此不可能完全理解该方案。 但…

如果单例中仅有的东西是那些需要刷新的值,那么显然该对象根本应该是单例。 您只需要在调用者想要“刷新”的任何时间创建一个新实例。

如果你做这个单,因为一些东西是不变的,可以/应该共享,那么你还是不应该让公众对象本身是独生子。 相反,使用单例作为实现的一部分; 即管理不变部分的private static成员,而单个实例包含可能需要刷新的数据。 在这种设计中,您将再次要求调用者创建一个新实例以“刷新”。

请注意,您可以在非单例实现中包括Refresh()方法。 但是,我建议不要这样做。 不必要地会使API的设计复杂化。 另外,如果您不允许在对象本身上进行“刷新”,则可以使对象不可变,如果在多线程方案中使用了代码,则有好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM