シングルトンが邪悪であることは間違いありません。おそらく時には過度に使用されることもありますが、場合によっては仕事にぴったりです。アプリケーションによっては、何らかの一般的なデータマネージャを持つことが理にかなっています。シングルトンパターンは、SDK自体(アプリケーションデリゲート、共有マネージャ、デフォルトセンターなど)で広く使用されています。ほとんどの場合、共有インスタンスにアクセスできるだけでなく、必要に応じて新しいインスタンスを作成できるため、これらは「純粋な」シングルトンではありません。
自分自身に質問する必要がある質問は、いつでもどこからでもデータマネージャの単一インスタンスにアクセスすることが有益かどうかということです。そうでない場合は、シングルトンはおそらく必要ありません。しかし、マルチスレッド環境でシングルトンを使用する場合は、競合状態(別のスレッドがリソースにアクセスしている間にスレッドを変更することができます)を心配する必要があります。ドキュメントでは、これをCocoa 。
例を挙げてみましょう - 私が書いたゲームのコードを使用しています。たとえば、GameMap
クラスとTile
クラスがあるとします。 GameMap
は、Tile
オブジェクトの2次元グリッドを表します。
GameMap *gameMap = [[GameMap alloc] init];
NSArray *theTiles = gameMap.tiles;
GameMap
のインスタンスは、タイルのグリッドを所有しており、ゲームマップが作成されたときにタイルを作成します。シングルトンは必要ありません。
あなたは「私は一度にGameMap
を1つしか持っていません、それは大したことですか?」と言うかもしれません。保存されたゲームの読み込みや新しいレベルの読み込みはどうですか?
// In whatever class object owns the game map
self.gameMap = [[GameMap alloc] initWithSaveData:saveData];
結論として、物事の他のインスタンスを管理するコードを持つクラスのインスタンスを作成します。できるだけグローバルなレベルを保ち、コードのスケーラビリティとメンテナンス性を向上させます。
いいえ、悪くないです。 Appleが提供する多くのiOS SDKクラスは、シングルトンとして実装されています。アップルのコードは自動的に良いコードだと言っているわけではありませんが、シングルトンのパターンはクオリティを引き換えないことを強く暗示しています。 – aroth