web-dev-qa-db-ja.com

グローバル変数もシングルトンもないマネージャークラスを作成するにはどうすればよいですか?

アプリケーションにある種のマネージャークラスを実装したいと思います。テクスチャのロード、処理、配布などを担当します...

最初は、マネージャークラスのインスタンスのみを含むグローバル変数を作成したいと考えていました。私はこの質問を見つけました: https://stackoverflow.com/questions/4646577/global-variables-in-Java 。ただし、そこにあるユーザーは、グローバル変数を使用しないことを推奨しているようです。

それで、シングルトンについて聞いたことがあったので、代わりにそれを使うこともできました。つまり、マネージャークラスのインスタンスを1つだけ作成するのは良いことです。しかし、私はこの別の質問を見つけました: シングルトンはいつ適切ですか? 、これは基本的に、シングルトンはほとんどのシナリオで何らかのアンチパターンであることを示しています。

今、私は少し迷っています-マネージャークラスを作成するために他にどのようなアプローチを取ることができますか?

7
Omega

依存性注入 フレームワークを使用して 制御の反転 を実現することを検討することをお勧めします。

「マネージャー」は従来のシングルトンではなく、フレームワーク構成を通じて作成するだけです。 「マネージャー」もグローバルではありませんが、それを使用する必要があるすべてのコンポーネントに割り当てられます。

13
smp7d

どこからでもアクセスできることが唯一の要件ですか?

実際にこれらの2つの質問を読みましたか?

どこからでもアクセスできるものを用意することは、設計上の落とし穴#1です。それはあなたのマネージャーをあなたのコードにしっかりと結合し、それが必要とされるほど柔軟であるのを防ぎ、コードをテストすること、デバッグすること、同時に実行することを困難にします...

いいえ。あなたが必要がある場合マネージャー が必要です(私は個人的にリンクを強く信じていませんが、注目に値します)次に、アプリはそれを作成し、テクスチャなどのファクトリ/マネージャーが必要なものに渡します。

4
Telastyn

テクスチャのロード、処理、配布を担当します

まあ、私はあなたのアプリケーションを知りませんが、これはアプリケーションのどこにでも必要なもののように聞こえることはほとんどありません。特に、アプリケーションが階層化されている場合はそうです。あなたはあなたのアプリケーションでそれを必要としますどこか、そしてそれはあなたがそれを渡すべき場所です、それ以上でもそれ以下でもありません。

さらに、これらの3つの責任は、3つのクラスに分割する方がよい場合があります。1つはテクスチャのロード、1つはテクスチャの処理、もう1つは配布です。最後のものはおそらく唯一のものですsomeアプリケーションの他の部分は外部からアクセスする必要があるかもしれません。

「テクスチャマネージャー」用のインターフェースを作成することも検討します。これをITextureManagerと呼びましょう。マネージャーへのアクセスを必要とするクラス/オブジェクトには、コンストラクターを通じてITextureManagerインスタンスを渡す必要があります。後で、@ smp7dのようなDIフレームワークの使用を検討することもできますが、実際にはそれは質問に関して実際の違いはありません。コードをマネージャークラスから「手動」で分離できない場合は、 DIフレームワークを使用しようとするときは、これ以上成功しないでください。

4
Doc Brown