Objective-C中所谓的“类集群”究竟是什么?

我在读NSArray就是这样的事情。 听起来很沉重。 在我的桌面上,我有7本关于Objective-C,Cocoa和C的真正胖书。没有一本书提到Class Cluster,至less我在书的后面找不到索引。 那是什么?

从苹果的文档…。 简而言之,它是Foundation框架中使用的devise模式,这可能是ObjC书籍中没有提到的原因。

我不知道Steve引用的CDP是什么,但基本上Objective-C类集群是一个支持实现抽象工厂模式的构造。

这个想法很简单 :您想要提供一个工厂(集群)接口,只需最less的描述,就可以制造并返回一个Factory对象的具体实例,以满足Factory(集群)接口描述的集群系列的行为。

一个简单的具体的例子 :这个例子提供了一个笑工厂,生产具体的笑声types的具体类(如Guffaw,Giggle)。 注意笑initWithLaughter:方法。

在笑h:

#define kLaughWithGuffaw 1 #define kLaughWithGiggle 2 @interface Laugh: NSObject {} - (Laugh *) initWithLaughter:(NSUInteger) laughterType; - (void) laugh; @end 

在笑声中:

 @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 

从术语表中第498页的Stephen Kochan编写的目标c中,cluster:

抽象类,它将一组私有的具体子类组合在一起,通过抽象类为用户提供一个简化的接口。

类集群为一组具体的私有子类实现提供单个公共接口。 一个Objective-C程序员经常使用类集群,很less意识到这一点 – 这是类集群的全部要点。 类集群的工作是隐藏公共接口背后的实现细节的复杂性。

许多Foundation类都是类集群,比如NSString,NSArray,NSDictionary和NSNumber。 当你调用[NSString stringWithFormat:]类集群给你一些实现NSString接口的具体类。 它可能是一个NSConcreteStringNSCFStringNSFooBarString等。类集群给你的是基于你正在调用的构造函数或初始化和参数。

正因为如此,类集是Objective-C编程中最赋予权力的概念之一。

  • 很容易实现
  • 轻松更改底层实现,而不必更改调用它的代码。
  • 易于在运行时提供不同的具体实现(即testing资源或模拟对象)
  • 正因为如此,易于testing和重构

如果你来自其他语言,你可能会熟悉“四人帮”模式。 类簇具有抽象工厂和立面模式的元素。

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

cocoa核心竞争力:类集群

cocoa基本指南:class级集群

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

NSArray类的集群不是“重量级”的,这是一个数组类的任何数量的实现都可以在你的代码不知道或关心具体实现的情况下使用的一种方法。 在底层,NSArray的具体子类适用于不同的用例,比如大的,稀疏的数组或包含在编译时已知的特定数量的元素的数组。

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

Interesting Posts