我意识到有很多关于单例以及为什么不好的讨论。这不是这个问题的目的。我了解单身人士的缺点。
我有一个场景,使用单例很容易并且看起来很有意义。但是,我想要一个替代方案,它可以在没有大量开销的情况下完成我所需要的。
我们的应用程序设计为客户端,通常在现场的笔记本电脑上运行并与后端服务器通信。我们在主应用程序的底部有一个状态栏。它包含一些显示各种雕像和信息的文本区域以及几个图标。图标更改其图像以指示其状态。例如指示是否连接的 GPS 图标以及错误状态。
我们的主类称为 MobileMain。它拥有状态栏区域并负责创建它。然后我们有一个 StatusBarManager 类。StatusBarManager 目前是一个静态类,但也可以是一个单例。这是课程的开始。
public static class StatusBarManager
{
static ScreenStatusBar StatusBar;
/// <summary>
/// Creates the status bar that it manages and returns it.
/// </summary>
public static ScreenStatusBar CreateStatusBar()
{
StatusBar = new ScreenStatusBar();
return StatusBar;
}
MobileMain 向 StatusBarManager 请求 StatusBar。然后它使用状态栏。没有其他类看到 StatusBar,只有 StatusBarManager。
状态栏的更新几乎可以来自应用程序中的任何地方。大约有 20 个类可以更新状态栏上的文本区域,还有其他类可以更新图标状态。
只有一个 StatusBar 和一个 StatusBarManager。
有什么更好的实施建议吗?
我的一些想法:
使 StatusBarManager 成为一个实例类。在我的 MobileMain 类中,保留 StatusBarManager 类的静态公共实例。然后要进行状态栏更新,您将调用 MobileMain.StatusBarManager.SetInformationText 或管理器的其他方法。StatusBarManager 不会是单例,但 MobileMain 只会创建它的静态实例。这里的问题是 MobileMain 现在有一个 StatusBar 和一个 StatusBarManager,它只管理它拥有的 StatusBar。仍然有一个全局可用的 StatusBarManager 静态实例,只是一个不同的所有者。
另一个想法是使用类似 EventEggregator 类的东西。我从来没有用过,但读过它们。我想这个概念是它将是一个全球可用的类。在每个想要更新状态栏的类中,它都会发布一个 StatusBarUpdate 事件。StatusBarManager 将是唯一订阅 StatusBarUpdate 事件的类,并接收所有通知。我已经阅读过,如果您在清理对象时不小心取消订阅事件,那么这种方法可能会导致泄漏。这种方法值得研究吗?