Objective-C中究竟是什么叫做“类群”?

时间:2009-12-04 00:48:30

标签: objective-c cocoa cocoa-design-patterns class-cluster

我读到NSArray就是这样的事情。听起来很沉重。我在桌面上有7本非常胖的书,关于Objective-C,Cocoa和C.他们都没有提到Class Cluster,至少我在书的后面的索引中找不到它。那是什么?

5 个答案:

答案 0 :(得分:190)

我不知道Steve引用的CDP中有什么,但基本上Objective-C Class Cluster是一个支持实现抽象Factory模式的构造。

想法很简单:您希望提供一个工厂(群集)接口,该接口以最少的描述制造并返回工厂对象的特定具体实例,满足Factory(Cluster)接口描述的集群系列的行为。

一个简单的具体示例:此示例提供了一个Laugh工厂,可以生成特定笑声类型的具体类(例如,Guffaw,Giggle)。注意 Laugh initWithLaughter:方法。

在Laugh.h:

#define kLaughWithGuffaw  1
#define kLaughWithGiggle  2

@interface Laugh: NSObject {}
- (Laugh *) initWithLaughter:(NSUInteger) laughterType;
- (void) laugh;
@end

在Laugh.m中:

@interface Guffaws:Laugh {}
- (void) laugh;
@end

@interface Giggles:Laugh {}
- (void) laugh;
@end

@implementation Laugh
- (Laugh *) initWithLaughter:(NSUInteger) laugherType {
    id instanceReturn=nil;
    ; // Removed for ARC [self release]
    if ( laughterType == kLaughWithGuffaw )
        instanceReturn = [[Guffaws alloc]init];
    else if( laughterType == kLaughWithGiggle )
        instanceReturn = [[Giggles alloc]init];
    else
        ; // deal with this
    return instanceReturn;
}

- (void) laugh {
    NSLog(@"Humbug");
}
@end

@implementation Guffaws
    - (void) laugh {
        NSLog(@"OH HA HA HOWAH HA HA HA");
    }
@end

@implementation Giggles
    - (void) laugh {
        NSLog(@"Tee hee");
    }
@end

答案 1 :(得分:38)

From Apple's docs...。简而言之,它是基金会框架中使用的设计模式,这可能是ObjC书中未提及的原因。

  

类集群是一种体系结构,它在公共抽象超类下对许多私有的具体子类进行分组。以这种方式对类进行分组为用户提供了简化的界面,用户只能看到公开可见的体系结构。

答案 2 :(得分:25)

来自Stephen Kochan的目标c中的编程,第498页的词汇表,群集:

  

一组抽象类   私人具体子类,提供   一个简化的用户界面   通过抽象类。

答案 3 :(得分:16)

类集群为一组具体的私有子类实现提供单个公共接口。一个Objective-c程序员经常使用类集群而很少意识到它 - 这就是类集群的重点。类集群的工作是隐藏公共接口背后的实现细节的复杂性。

许多Foundation类都是类集群,例如NSString,NSArray,NSDictionary和NSNumber。当你调用[NSString stringWithFormat:]时,类集群会给你一些实现NSString接口的具体类。它可以是NSConcreteStringNSCFStringNSFooBarString等。类集群为您提供的是基于您调用的构造函数或初始化程序以及参数。

因此,类集群是Objective-C编程中最具功能性的概念之一。

  • 非常容易实施
  • 轻松更改底层实现,而无需更改调用它的代码。
  • 在运行时轻松提供不同的具体实现(即测试资源或模拟对象)
  • 由于上述原因,易于测试和重构

如果您来自其他语言,您可能熟悉四人组模式。类集群具有抽象工厂和外观模式的元素。

Apple的公共文档非常广泛地涵盖了类集群(以及如何实现和扩展它们)。不幸的是,我发现对于许多iOS开发人员来说,这个和其他Cocoa特定的模式是一个盲点。

Cocoa Core Competencies: Class cluster

Cocoa Fundamentals Guide: Class Clusters

Examples of how to implement your own class clusters are available on GitHub

答案 4 :(得分:7)

NSArray类集群不是“重量级”,它可以在不让您的代码了解或关注特定实现的情况下使用任何数量的数组类实现。在引擎盖下,NSArray的具体子类适用于不同的用例,例如大型,稀疏数组或包含编译时已知的特定数量元素的数组。

NSArray,NSString和NSNumber是您最常遇到的类集群。