我在读 NSArray 就是这样的东西。听起来很沉重。我的办公桌上有 7 本关于 Objective-C、Cocoa 和 C 的非常厚的书。它们都没有提到 Class Cluster,至少我在书后的索引中找不到。那是什么?
5 回答
我不知道 Steve 引用的 CDP 中有什么,但基本上 Objective-C 类集群是一个支持实现抽象工厂模式的构造。
这个想法很简单:您希望提供一个工厂(集群)接口,该接口以最少的描述制造并返回工厂对象的特定具体实例,该实例满足工厂(集群)接口所描述的集群系列的行为。
一个简单的具体示例:这个示例提供了一个 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
来自Apple的文档...... 简而言之,它是 Foundation 框架中使用的一种设计模式,这可能是 ObjC 书籍中没有提到它的原因。
类集群是一种架构,它将许多私有的、具体的子类组合在一个公共的、抽象的超类下。以这种方式对类进行分组为用户提供了一个简化的界面,用户只能看到公开可见的架构。
来自 Stephen Kochan 在词汇表中第 498 页的目标 c 编程,集群:
一个抽象类,它组合了一组私有具体子类,通过抽象类为用户提供简化的接口。
类簇为一组具体的私有子类实现提供了一个单一的公共接口。Objective-c 程序员经常使用类簇,但很少意识到这一点——这就是类簇的全部意义所在。类集群的工作是将实现细节的复杂性隐藏在公共接口后面。
许多 Foundation 类是类簇,例如 NSString、NSArray、NSDictionary 和 NSNumber。当您调用[NSString stringWithFormat:]
类集群时,会为您提供一些实现NSString
接口的具体类。它可以是NSConcreteString
, NSCFString
,NSFooBarString
等。类集群为您提供的内容基于您正在调用的构造函数或初始化程序以及参数。
因此,类集群是 Objective-C 编程中最强大的概念之一。
- 很容易实现
- 无需更改调用它的代码即可轻松更改底层实现。
- 易于在运行时提供不同的具体实现(即测试资源或模拟对象)
- 由于以上原因,易于测试和重构
如果您来自其他语言,您可能熟悉四人帮模式。类簇具有抽象工厂和外观模式的元素。
Apple 的公共文档非常广泛地涵盖了类集群(以及如何实现和扩展它们)。不幸的是,我发现对于许多 iOS 开发人员来说,这种和其他 Cocoa 特定的模式是一个盲点。
NSArray 类集群不是“重量级”,它是一种可以在您的代码不知道或关心特定实现的情况下使用任意数量的数组类实现的方式。在底层,有适用于不同用例的 NSArray 的具体子类,例如大型稀疏数组或包含特定数量的在编译时已知的元素的数组。
NSArray、NSString 和 NSNumber 是您最常遇到的类簇。