2017-01-28 7 views
1

私のゲームでシングルトンパターンを実装して、staticのような関数と変数instanceにアクセスしました。すべてうまく、良い、私はそれを便利に使用することができます。しかし、私の理解から、すべてにコストがかかり、この使い易さには何らかの欠点があるはずです。質問は、たとえば、頻繁に使用する多くの費用ですか?GameManager.instance.someOtherClass.someVariable?一般的に、どのようにパフォーマンスに優しいSingletonですか?シングルトンパターンのパフォーマンスの欠点

答えて

2

大きなソフトウェアシステムを設計する重要な要素は、コンポーネントとクラスの結合を最小限に抑えることです。これは、異なるコンポーネントの実装のカプセル化によって行うことができます。より多くのコンポーネントが互いに知っているほど、それらの間の依存関係が高くなります。

シングルトンパターンを使用することは、実装クラスに結合することを意味します(インターフェイスまたは抽象化ではありません)。 GameManagerを使用している各コンポーネントが代わりにGameManagerInterfaceを使用すると、実装を簡単に変更または拡張することができます。コンティニュアスシングルトンクラスへの依存関係を隠すことは、静的メソッドを呼び出す必要があるため困難です。このようなシングルトンパターンを使用して

... 
IGameManager iGameManager = GameManager.getInstance(); 
... 

は...です:

GameManager.instance.someOtherClass.someVariable  

...良いアイデアになることはありません。そうすることで、呼び出し側のクラスを呼び出された各クラスの実装に結合することになります。 「法律の法律」 (a.k.a.「尋ねないでください」または「見知らぬ人と話してはいけない」)で述べたように、あなたの直接の隣人とだけ通信するのが最善です。

シングルトンパターンの目的について考えてみてください。シングルトンパターンは、クラスのインスタンスが1つしかないことを保証するために使用されます。これ以上何もない。

コード内の静的な「getInstance」メソッドを使用すると、前述のように隠された依存関係が発生します。あなたがやっていることは、グローバル変数の代わりにシングルトンパターンを使うことです。これは、コードのすべてのビットがシングルトンクラスの実装に依存するため、システムを壊れやすくします。このクラスを変更すると、システム全体がクラッシュする可能性があります。

+0

巨大なプログラムではありませんが、実際にはできるだけ早く学ぶことが最善です。だから、クラスには「Character」というクラスがあります。そして、このキャラクタークラスは、シングルトンに格納されているディテールを知りたいとします。例えば、levelUpBoundaryは、キャラクターがどれくらいの高さを持つことができるかを表します。 今は 'GameManager.instance.levelUpBoundary'でこれを取得します。あなたの言うことは、私が 'Character'スクリプトで変数を作成する必要があるということです: ' IGameManager iGameManager = GameManager.getInstance(); 'あなたの言ったように?もしそうなら、どのように正確にそれを行うのですか? –

+0

最初に、結束と呼ばれるものがあります。これは、メソッドが作業するデータに近いものでなければならないことを意味します。構造について考えるべきです。 GameManagerが文字のlevelUpBoundariesについて何かを知っていることは本当に必要ですか?私の意見では、Characterクラスの実装の詳細です。第二に、前述したように、ここで使用しているものをグローバル変数に置き換えるシングルトンパターンではありません。メインメソッドでGameManagerを通常のオブジェクトとして作成し、他のオブジェクトに抽象化として注入する必要があります。 – Janis

0

一般的に、Javaはそのようなアクセスを頻繁に最適化できるようにすべきです。私はあなたが本当に完成したゲームを持って衝撃を測定しながらパフォーマンスチューニングを始めるまで、パフォーマンスヒットは重要ではないと思います。

複数のインスタンスを使用する場合には、より深刻な問題が発生する可能性があります。その場合、アーキテクチャを変更する必要があります。私は一般的にシングルトンの友人ではなく、クラスの2番目のインスタンスを必要とする方法がないことを100%確信している場合にのみ使用します。

+1

これは事実です。私の場合、シングルトンを使うと、それはゲーム/アプリ全体で1つだけのシングルトンです。私は、何かを過度に使いすぎないようにして、拡張性を容易にするためにコンポーネントにコンポーネントを分割します。 –

+0

その場合、ちょうどそれと一緒に行く。私はあなたのパフォーマンスに測定可能な影響を与えることは絶対にないと確信しています。これは、通常、グラフィックス操作やネットワークトラフィック、地形生成などの重大なアルゴリズムから発生します。シングルトンには絶対にアクセスできません。 – Silverclaw

2

頻繁にシングルトンパターンを使用するとパフォーマンスの低下はありません。この観点から、あなたが好きな回数何回それを使用してください。 しかし、この変数が頻繁に必要な場合は、再設計について考える必要があります。 グローバル変数が必要な場合は、シングルトンを使用しないでください。シングルトンの理由は1つだけです。「クラスのインスタンスを複数持つことは許されません」

このパターンには注意してください。 Janisはその問題を非常によく彼のanswerで説明しました。

0

答えは簡単ですが、測定シングルトンと非シガルトンアプローチです。シングルトンでは、新しいオブジェクトがヒープ上に1回作成されます。シングルトンでない場合は、各呼び出しで新しいオブジェクトが作成されます。

関連する問題