10

そのトピックに関する多くのスレッドにもかかわらず、どのアプローチをいつ選択するかについてはまだ不明です. 具体的な例を議論することで、最終的に「理解」できることを願っています。

注: 一般的な問題は言語固有ではありませんが、ここでの私の言語は Cocoa です。

次の目的で使用したいクラス TaskQueue があります。

  • スケジュールされたタスクを追加または削除するために、コードのどこからでもアクセスできます
  • スケジュールされたタスクを定期的に自動的に処理する

TaskQueue を最初に使用するときに、TaskQueue にスレッドを開始させてから、一定の間隔で起動してタスクを処理するようにします。

明らかに、少なくとも 2 つの変数が必要になります。

  • タスクを格納する配列
  • タスクを処理するスレッドのインスタンス

タスクのキューを 1 つと、これらのタスクを処理するスレッドを 1 つだけにしたいので、次の 2 つの選択肢があります。

  1. TaskQueue をシングルトン クラスにします (たとえば、http://www.cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.htmlで説明されているように CWL_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR を使用して、CWLSynthesizeSingleton を変更する必要があると思います)。 h ファイルを使用して、init 時にスレッドを開始します。)

  2. タスクの配列とスレッド インスタンスの両方を静的にします (ここで提案されているアプローチに従います: How do I declare class-level properties in Objective-C? )

この特定のケースで、他のアプローチよりも優れているアプローチが明らかにありますか? もしそうなら、なぜですか?

4

2 に答える 2

34

主な違いは次のような単純なものです。

  • シングルトンを使用すると、デリゲートとコールバックのオブジェクトを渡すことができます
  • シングルトンを使用すると、インターフェイスを実装して派生させることができます
  • シングルトンを使用すると、ファクトリ パターンを使用してインスタンスを構築できます

コード全体でアクセスする必要があるグローバル機能のように、それらのいずれも必要ない場合は、静的メソッドを使用できます。

個人的には、シングルトン インスタンスを使用する明確な理由がない限り (共通のインターフェイスを使用するが実装が異なるなど)、静的メソッドを使用することを好みます。

静的メソッドをシングルトン インスタンスにリファクタリングするのは非常に簡単なプロセスであるため、後者の必要性が見つかった場合は簡単にリファクタリングできます (C プリプロセッサがあれば、シングルトン#defineでほぼ十分です)。

于 2012-12-31T05:11:01.750 に答える