我知道有很多讨论关于单例模式以及为什么它们不好。但这个问题并不是关于这个的。我了解使用单例模式的缺点。
我有一个场景,使用单例模式很容易且看起来很合理。但是,我想要一个替代方案,能够在不增加太多开销的情况下实现我所需要的功能。
我们的应用程序被设计成客户端,通常在现场的笔记本电脑上运行,并与后端服务器通信。我们在主应用程序底部有一个状态栏。它包含几个文本区域,显示各种状态和信息,以及几个图标。这些图标会改变它们的图像以指示它们的状态。例如,GPS图标表示是否连接以及错误状态。
我们的主类名为MobileMain。它拥有状态栏区域,并负责创建它。然后我们有一个StatusBarManager类。StatusBarManager目前是一个静态类,但也可以是单例模式。以下是该类的开头。
MobileMain会向StatusBarManager请求一个StatusBar,然后使用该StatusBar。其他类不会看到StatusBar,只有StatusBarManager能够看到。
状态栏的更新可以来自应用程序中的任何地方。大约有20个类可以更新状态栏上的文本区域,还有其他类可以更新图标状态。
将只有一个StatusBar和一个StatusBarManager。
有关更好的实现方式的任何建议?
我想过一些想法:
使StatusBarManager成为实例类。在我的MobileMain类中,保持对StatusBarManager类的静态公共实例的引用。然后要进行状态栏更新,您将调用MobileMain.StatusBarManager.SetInformationText或管理器的某些其他方法。StatusBarManager将不是一个单例,但MobileMain只会创建它的静态实例。问题在于MobileMain现在拥有一个StatusBar和一个StatusBarManager,仅管理其拥有的StatusBar。仍然需要全局可用的静态StatusBarManager实例,只是不同的所有者。
另一个想法是使用像EventEggregator类这样的东西。我从未使用过,但已经了解过。我猜想的概念是它将是一个全局可用的类。在每个想要更新状态栏的类中,它都会发布一个StatusBarUpdate事件。StatusBarManager将是订阅StatusBarUpdate事件的唯一类,并接收所有通知。我已经读过了,如果在清理对象时不小心取消订阅事件,则可能会出现泄漏。这种方法值得研究吗?
我有一个场景,使用单例模式很容易且看起来很合理。但是,我想要一个替代方案,能够在不增加太多开销的情况下实现我所需要的功能。
我们的应用程序被设计成客户端,通常在现场的笔记本电脑上运行,并与后端服务器通信。我们在主应用程序底部有一个状态栏。它包含几个文本区域,显示各种状态和信息,以及几个图标。这些图标会改变它们的图像以指示它们的状态。例如,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。其他类不会看到StatusBar,只有StatusBarManager能够看到。
状态栏的更新可以来自应用程序中的任何地方。大约有20个类可以更新状态栏上的文本区域,还有其他类可以更新图标状态。
将只有一个StatusBar和一个StatusBarManager。
有关更好的实现方式的任何建议?
我想过一些想法:
使StatusBarManager成为实例类。在我的MobileMain类中,保持对StatusBarManager类的静态公共实例的引用。然后要进行状态栏更新,您将调用MobileMain.StatusBarManager.SetInformationText或管理器的某些其他方法。StatusBarManager将不是一个单例,但MobileMain只会创建它的静态实例。问题在于MobileMain现在拥有一个StatusBar和一个StatusBarManager,仅管理其拥有的StatusBar。仍然需要全局可用的静态StatusBarManager实例,只是不同的所有者。
另一个想法是使用像EventEggregator类这样的东西。我从未使用过,但已经了解过。我猜想的概念是它将是一个全局可用的类。在每个想要更新状态栏的类中,它都会发布一个StatusBarUpdate事件。StatusBarManager将是订阅StatusBarUpdate事件的唯一类,并接收所有通知。我已经读过了,如果在清理对象时不小心取消订阅事件,则可能会出现泄漏。这种方法值得研究吗?