シングルトンとそれがなぜ悪いのかについて多くの議論があることを私は認識しています。それはこの質問の目的ではありません。シングルトンの欠点を理解しています。
シングルトンを使用するのが簡単で、理にかなっているように見えるシナリオがあります。ただし、多くのオーバーヘッドなしで必要なことを達成できる代替手段が必要です。
私たちのアプリケーションは、通常、現場のラップトップで実行され、バックエンド サーバーと通信するクライアントとして設計されています。メイン アプリケーションの下部にステータス バーがあります。さまざまな像や情報、およびいくつかのアイコンを表示するいくつかのテキスト領域が含まれています。アイコンのイメージが変わり、状態が示されます。接続されているかどうか、およびエラー状態を示す 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 はそれぞれ 1 つだけです。
より良い実装のための提案はありますか?
私が持っていたいくつかの考え:
StatusBarManager をインスタンス クラスにします。私の MobileMain クラスでは、StatusBarManager クラスの静的パブリック インスタンスを保持します。次に、ステータス バーの更新を行うには、MobileMain.StatusBarManager.SetInformationText またはマネージャーの他のメソッドを呼び出します。StatusBarManager はシングルトンではありませんが、MobileMain はその静的インスタンスを作成するだけです。ここでの問題は、MobileMain が StatusBar と StatusBarManager を持つようになったことです。これは、所有する StatusBar を管理するだけです。また、所有者が異なるだけで、StatusBarManager へのグローバルに利用可能な静的インスタンスも保持しています。
もう 1 つのアイデアは、EventEggregator クラスのようなものを使用することでした。私は一度も使用したことがありませんが、それらについて読んだことがあります。コンセプトは、それがグローバルに利用可能なクラスになるということだと思います。ステータス バーを更新する各クラスでは、StatusBarUpdate イベントを発行します。StatusBarManager は、StatusBarUpdate イベントをサブスクライブする唯一のクラスであり、すべての通知を受け取ります。オブジェクトをクリーンアップするときにイベントからの登録解除に注意しないと、このアプローチでリークが発生する可能性があることを読んだことがあります。このアプローチは検討する価値がありますか?