反シングルトンの解説を最初に見始めたとき、私は混乱しました。最近のいくつかのプロジェクトでシングルトンパターンを使用しましたが、それは見事に機能していました。実際、私はそれを何度も何度も使用してきました。
さて、いくつかの問題に遭遇した後、このSOの質問、特にこのブログ投稿を読んだ後、私は世界にもたらした悪を理解しました。
だから:既存のコードからシングルトンを削除するにはどうすればよいですか?
例:
小売店の管理プログラムでは、MVCパターンを使用しました。私のModelオブジェクトはストアを記述し、ユーザーインターフェイスはビューであり、2つの間のリエゾンとして機能する一連のコントローラーがあります。素晴らしい。ストアをシングルトンにしたことを除いて(アプリケーションは一度に1つのストアしか管理しないため)、ほとんどのコントローラークラスもシングルトンにした(1つのmainWindow、1つのmenuBar、1つのproductEditor ...)。これで、ほとんどのControllerクラスが次のような他のシングルトンにアクセスできるようになりました。
Store managedStore = Store::getInstance();
managedStore.doSomething();
managedStore.doSomethingElse();
//etc.
代わりに:
- 各オブジェクトのインスタンスを1つ作成し、それらにアクセスする必要があるすべてのオブジェクトに参照を渡しますか?
- グローバルを使用しますか?
- 他に何かありますか?
グローバルはまだ悪いでしょうが、少なくとも彼らはふりをしていません。
#1は、ひどく膨らんだコンストラクター呼び出しにすぐにつながることがわかります。
someVar = SomeControllerClass(managedStore, menuBar, editor, sasquatch, ...)
他の誰かがこれをもう経験しましたか?グローバルまたはシングルトンでなくても、共通の変数に多くの個別のクラスアクセスを与えるオブジェクト指向の方法は何ですか?