[英]Avoiding unnecessary set accessor for TwoWay DataBinding to Collection
[英]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.