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

ope*_*rog 89 cocoa objective-c cocoa-design-patterns class-cluster

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

Fra*_* C. 192

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

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

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

在Laugh.h:

#define kLaughWithGuffaw  1
#define kLaughWithGiggle  2

@interface Laugh: NSObject {}
- (Laugh *) initWithLaughter:(NSUInteger) laughterType;
- (void) laugh;
@end
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

  • 虽然其他答案很好,提供了文档和书籍链接,但我喜欢这个,因为它让你看到如何实现这一目标变得既简单又简单.谢谢 (23认同)
  • **(1)**在`init`方法中释放self并返回其他内容有多安全?是否有Apple的代码示例?**(2)**另外,你可能会创建一个带有代码的实例,例如`[[Laugh alloc] initWithLaughter:kLaughWithGiggle]`.注意"笑"是如何被不必要地分配的,因为它将在此次调用后立即释放.为什么这样你可以创建一个类方法,如`[Laugh laughWithLaughter:kLaughWithGiggle]`,它给你私有子类的所有优点,同时避免上面的问题1和2? (4认同)

ech*_*cho 40

从苹果公司的文档.......简而言之,它是基础框架中使用的设计模式,这可能是ObjC书籍中没有提到的原因.

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


小智 25

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

一个抽象类,它对一组私有具体子类进行分组,通过抽象类为用户提供简化的接口.

  • +1用于引用Objective-C书中的答案,特别是考虑到原始问题.那本书也是一本好书. (5认同)

que*_*ish 18

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

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

因此,类集群是Objective-C编程中最具权力的概念之一.

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

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

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

Cocoa核心能力:类集群

Cocoa Fundamentals Guide:Class Clusters

GitHub上提供了如何实现自己的类集群的示例


NSR*_*der 7

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

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

  • 具有讽刺意味的是,实际上,每个集群只使用一个具体类 - NSCF {Array | String | Number} - 并且实现更改是该类的内部.无论如何,据我所知.甚至NSArray和NSMutableArray实例也显示相同的类. (6认同)
  • @罗伯特:事实上,在我发表评论时就是这种情况。现在苹果已经用 __NSArrayM 和 __NSArrayI 取代了 NSCFArray,所以我认为不再是这样了,但依赖它我仍然感觉不舒服,因为他们总是可以再次改变它。 (2认同)