回答:
間違いなく非網羅的なリストですが、ここに行きます:
ハンドヘルドタイトルでは、「グローバルシングルトンの構造体」をよく使用します。PCとコンソールのタイトルは、それらにあまり依存しない傾向があります。さらに、イベント駆動型/メッセージングアーキテクチャに切り替えます。そうは言っても、pc / consoleのタイトルは依然として中央のTextureManagerをしばしば使用します。通常は単一の共有リソース(テクスチャメモリ)をラップするので、これは私たちにとって理にかなっています。
APIを比較的クリーンに保つ場合、必要なときにシングルトンパターンからリファクタリングする(またはシングルトンパターンにリファクタリングする)ことはそれほど難しくありません...
シングルトン設計自体はまったく役に立たないと思います。グローバル変数は明らかに便利ですが、適切に記述されたインターフェースの背後に隠されているので、それらの存在を意識する必要はありません。シングルトンを使用すると、その存在を明確に認識できます。
エンジン全体にアクセスする必要があるものには、しばしばグローバル変数を使用します。私のパフォーマンスツールは、エンジン全体で使用する良い例の1つです。呼び出しは簡単です。ProbeRegister()、ProbeHit()、ProbeScoped()。彼らの実際のアクセスは少しトリッキーであり、いくつかのもののためにグローバル変数を使用します。
グローバルと不十分に実装されたシングルトンの主な問題は、あいまいな構築と解体のバグです。
したがって、これらの問題のないプリミティブを使用する場合、またはポインターの問題を非常に認識している場合。その後、安全に使用できます。
グローバルは、gotoと同じようにその場所を持ち、すぐに解雇されるべきではなく、注意して使用されます。
Google C ++スタイルガイドでそれについての良い説明があります
私は、シングルトンの代わりにカスタムライフタイム管理のある種類のDI / IoCコンテナーを使用することをお勧めします(「シングルインスタンス」ライフタイムマネージャーを使用している場合でも)。少なくとも、テストを容易にするために実装を交換するのは簡単です。
シングルトンのメモリ節約機能が必要な場合は、フライウェイトデザインパターンを試すことができますか?
http://en.wikipedia.org/wiki/Flyweight_pattern
上記のマルチスレッドの問題に関する限り、スレッド間で共有される可能性のあるリソースのロックメカニズムを実装することは、ある程度簡単に見通せるはずです。 http://en.wikipedia.org/wiki/Read/write_lock_pattern
シングルトンは、初期状態のプロトタイプに共有状態を格納するための優れた方法です。
これらは特効薬ではなく、いくつかの問題が発生しますが、特定のUI /ロジック状態に非常に役立つパターンです。
たとえば、iOSでは、[UIApplication sharedApplication]を取得するためにシングルトンを使用します。cocos2dでは、それを使用して[CCNotifications sharedManager]などの特定のオブジェクトへの参照を取得できます。個人的には、通常、[Game sharedGame]シングルトンから開始できます。多くの異なるコンポーネント間で共有される状態を保存します。
うわー、これは私にとって興味深いものです。個人的にシングルトンパターンに問題を抱えたことは一度もないので。私の現在のプロジェクトはニンテンドーDS用のC ++ゲームエンジンであり、それらはグローバルC基礎となるライブラリの関数。
グローバルははるかに高速です!したがって、ゲームのようなパフォーマンス重視のアプリケーションに完全に適合します。
シングルトンは、より優れたグローバルなIMOであり、適切なツールです。
控えめに使用してください!