シングルトンについての議論が多々あり、それがなぜ悪いのかが分かります。それはこの質問についてではありません。私はシングルトンの欠点を理解しています。私はシングルトンの代わりにデザインをしたい
シングルトンを使用するのが簡単で意味があるように見えるシナリオがあります。しかし、私は大量のオーバーヘッドなしに必要なものを達成するための代替手段が必要です。
私たちのアプリケーションは通常、現場のラップトップで実行され、バックエンドサーバーと通信するクライアントとして設計されています。メインアプリケーションの下部にステータスバーがあります。さまざまな彫像や情報だけでなく、いくつかのアイコンを表示するいくつかのテキスト領域が含まれています。アイコンは、その状態を示すためにイメージを変更します。接続されているかどうかを示す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種類あります。
ステータスバーとステータスバーマネージャはそれぞれ1つだけです。
より良い実装のための提案はありますか?
私が持っていたいくつかの考え:
はStatusBarManagerインスタンスクラスを作成します。私のMobileMainクラスでは、StatusBarManagerクラスの静的パブリックインスタンスを保持します。ステータスバーの更新を行うには、MobileMain.StatusBarManager.SetInformationTextまたはマネージャの他のメソッドを呼び出します。 StatusBarManagerはシングルトンではありませんが、MobileMainは静的インスタンスを作成するだけです。ここでの問題は、MobileMainがStatusBarとStatusBarManagerを持ち、StatusBarが所有するStatusBarだけを管理することです。 StatusBarManagerには、世界的に利用可能な静的インスタンスがあります。
もう1つのアイデアは、EventEggregatorクラスのようなものを使用することでした。私は一度も使ったことはありませんが、それらについて読んだことがあります。私は、それが世界的に利用可能なクラスであることをコンセプトにしていると思います。ステータスバーを更新したい各クラスでは、StatusBarUpdateイベントを発行します。 StatusBarManagerは、StatusBarUpdateイベントをサブスクライブする唯一のクラスであり、すべての通知を受け取ります。私はあなたがオブジェクトをクリーンアップするときにイベントからの登録を忘れることに注意していなければ、この方法でリークを起こすことがありますが、これを読んだことがあります。このアプローチは検討する価値がありますか?
この投稿には多数の質問があります。一度に1つずつ選んで回答を得てください。 – mydogisbox
あなたはMEFまたはUnityの使用について考えましたか?そこで、コンテナに必要なものを1つだけ登録して、他の場所から取得することができます。 – stijn
StatusBarManagerの命名に関連した良い読書。 http://www.codinghorror.com/blog/2006/03/i-shall-call-it-somethingmanager.html – Patrick