考虑以下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?
谢谢,皮特
答案 0 :(得分:1)
我同意那些声明你滥用单身人士模式的评论。
不幸的是,代码示例不完整,因此无法完全理解该方案。但...
如果单例中的 only 事物是那些需要刷新的值,那么显然这个对象应该不是一个单例。您应该只要求调用者在任何时候创建一个新实例,然后刷新"。
如果你把它变成单身,因为 某些东西是不变的并且可以/应该被共享,那么你仍然不应该让公共对象本身成为单身。相反,使用单例作为实现的一部分;即管理不变部分的private static
成员,而单个实例包含可能需要刷新的数据。在此设计中,您将再次要求调用者创建一个新实例,以便"刷新"。
请注意,您可以在非单例实现中包含Refresh()
方法。但是,我会建议不要这样做。它不必要地会使API的设计复杂化。此外,如果你不允许"刷新"在对象本身上,您可以使对象不可变,如果在多线程场景中使用代码,这将带来好处。