2

singletonProtocol を設定したい。そのプロトコルを実装するクラスは +(id) シングルトンをサポートします

明らかに、そのシングルトン メソッドを実装します。同じことを何度も実装し直すのはもったいない。

継承を使用できます。その方法は既に知っていますが、クラスは親を 1 つしか持つことができず、継承を使用するのはやり過ぎのように聞こえます。基本的に、それぞれのクラスの NSStringFromClass をキーとする NSMutableDictionary にシングルトンを格納します。なぜ誰もそれをしないのだろうか。これは、Objective-c で使用したのと同じ手法です。スコープがクラス全体である変数をどのように使用できますか (ただし、サブクラスは含まれません)。

#import "BGSuperSingleton.h"

static NSMutableDictionary * allTheSingletons;
@implementation BGSuperSingleton

+(id) singleton1
{
    NSString* className = NSStringFromClass([self class]);

    id result = allTheSingletons[className];

    if (result==nil)
    {
        result = [[[self class] alloc]init];
        allTheSingletons[className]=result;
    }
    return result;
}

@end

カテゴリ使えます。ただし、カテゴリは実質的にすべてのクラスで機能します。すべてのシングルトンが SuperSingleton クラスに属するように制限することはできますが、それは目的に反します

プロトコルを使用できます。今、それは素晴らしいです。ただし、プロトコルには実装がありません。プロトコルは、クラスが実行できるメソッドのみを宣言します。

それで、私は何をすべきですか?

4

1 に答える 1

3

だから、私は何をすべきですか?

デザインを再考する必要があります。これらの各クラスの共有インスタンスを持つことができるように、このプロトコルをいくつかの異なるクラスで採用したいと思われます。それらのオブジェクトは本当にシングルトンである必要がありますか?共有オブジェクトと、複数回インスタンス化してはならないクラスには違いがあります。

他のすべてのクラスのファクトリとして機能するクラスを作成することを検討してください。そのクラスは共有オブジェクトのディクショナリを維持でき、他のクラスをインスタンス化するために常にファクトリを使用することを簡単に指摘できます。実際、他のクラスをインスタンス化して直接例外などをスローするように作成できます。

于 2012-12-28T03:38:48.890 に答える