クラスクラスタclass cluster

2733 ワード

an architecture that groups a number of private,concrete subclasses under a public,abstract superclass.(共有抽象スーパークラスの下にプライベートサブクラスのセットを設定するアーキテクチャ)
Class clusterはAppleの抽象工場設計モデルの呼称である
class clusterの考え方は簡単です.情報を使用して初期化処理を行う間、抽象クラス(通常、初期化方法のパラメータまたは判定環境の可用性パラメータ)を使用して、特定の論理または具体的なサブクラスをインスタンス化します.この「Public Facing(公衆向け)」クラスは、特定のタスクに直面したときに適切なプライベートサブクラスのインスタンスを返す能力を持つために、プライベートサブクラスをよく知らなければならない.呼び出し者にとっては,オブジェクトの様々なAPIの役割を知るだけでよい.このモードは彼の背後にある複雑な初期化論理を隠し,呼び出し者も背後の実現に関心を持つ必要はない.
Class clustersはAppleのFrameworkで広く使用されています.NSNumberのようないくつかの明らかな例は、デジタルタイプがどのように提供するか(Integer、Float、etc...)やNSArrayが異なる最適なストレージポリシーのサブクラスを返すかによって、異なるタイプのサブクラスを返すことができます.
このモードの素晴らしい点は、呼び出し者がクラスを完全に管理しないことです.実際には、抽象的なスーパークラスの方法に従っているため、実際に返されたクラスを交換するためにライブラリを設計するために使用することができます.
**クラスクラスタを使用すると、多くの条件文を削除できます.**
古典的な例は、iPadとiPhoneのようなUIDIewControllerサブクラスを書いている場合ですが、異なるデバイスで異なる動作があります.
比較ベースの実装は、条件文でデバイスをチェックし、異なる論理を実行することである.最初はいいかもしれませんが、コードが増えるにつれて、実行ロジックも複雑になります.より良い実装の設計は、抽象的で広範なview controllerを作成して、すべての共有論理を含み、異なるデバイスに対して2つの特別なサブ例がある.
汎用ビューコントローラは、現在のデバイスをチェックし、適切なサブクラスを返します.
@implementation ZOCKintsugiPhotoViewController

- (id)initWithPhotos:(NSArray *)photos
{
    if ([self isMemberOfClass:ZOCKintsugiPhotoViewController.class]) {
        self = nil;

        if ([UIDevice isPad]) {
            self = [[ZOCKintsugiPhotoViewController_iPad alloc] initWithPhotos:photos];
        }
        else {
            self = [[ZOCKintsugiPhotoViewController_iPhone alloc] initWithPhotos:photos];
        }
        return self;
    }
    return [super initWithNibName:nil bundle:nil];
}

@end


このサブルーチンは、クラスクラスタを作成する方法を示します.
  • [self isMemberOfClass:ZOCK intsugiPhotoView Control.class]を使用して、サブクラスのリロード初期化方法を防止し、無限再帰を回避します.[[ZOCK intsugiPhotoViewControl alloc]initWithPhotos:photos]が呼び出されると、上記の条件式の結果はTrueになります.
  • self=nilの目的は、ZOCKintsugiPhotoViewControllerインスタンス上のすべての参照を削除することであり、インスタンス(抽象クラスのインスタンス)自体が割り当てを解除する(もちろんARCもMRCもdeallocもMain Runloopの今回の終了時に発生する).
  • の次の論理は、どのプライベートサブクラスが初期化されるかを判断することである.iPhone上でこのコードを実行し、ZOCK intsugiPhotoView Control_iPhoneはinitWithPhotos:メソッドをリロードしていません.この場合、self=[[ZOCK intsugiPhotoViewController_iPhone alloc]initWithPhotos:photos];ZOCKintsugiPhotoView Controlが呼び出され、最初のチェックがここで発生します.ZOCKintsugiPhotoView Control_iPhoneは完全にZOCK intsugiPhotoView Controlではなく、式[self isMemberOfClass:ZOCK intsugiPhotoView Control.class]がFalseになるので[super initWithNibName:nil bundle:nil]が呼び出され、ZOCK intsugiPhotoView Controlの初期化プロセスに入ります.このとき、呼び出し元がZOCK intsugiPhotoView Control自体なので、今回のチェックは必ずTrueとなり、次は正しい初期化プロセスが行われます.(NOTE:ここではDesignated initializerおよびSecondary initializerの設計仕様に完全に従っている必要があります!この仕様を理解していない人は一歩後退してこの仕様を熟知することができます.後でこの説明を見てください)