类簇(Class Cluster)是定义相同的接口并提供相同功能的一组类的集合,仅公开接口的抽象类也能够称之为类簇的公共类,每一个具体类的接口有公共类的接口抽象化,并隐藏在簇的内部。这些类通常不可以直接使用,通常都是由公共类的子类来实现,能够称之为私有子类。看概念会以为有点枯燥,其实最经常使用的NSString就是一个类簇,不过看起来不明显,比较明显的是NSNumber,numberWithInt,numberWithDouble,这些方法其实在调用NSNumber的时候父类实例化私有子类,返回对应的实例。小程序
概念通常都是比较枯燥一点,咱们能够先写一个简单的测试小程序来看一下NSString类簇大概的样子:设计模式
NSString *result=@"博客园-FlyElephant"; classClusterLog(result); classClusterLog([result stringByAppendingString:@"原文地址:http://www.cnblogs.com/xiaofeixiang/"]); classClusterLog([NSString stringWithUTF8String:"---"]); classClusterLog(NSHomeDirectory());
输出方法:数据结构
static void classClusterLog(NSString *str){ NSLog(@"Content=%@,Class=%s,\tmember=%s,\tkind=%s\n", str, [NSStringFromClass([str class]) UTF8String], [str isMemberOfClass:[NSString class]]?"Yes":"NO", [str isKindOfClass:[NSString class]]?"YES":"NO"); }
测试结果:框架
经过Log咱们输出了类的真实的类型,咱们发现每一个类的类型都不同,并且咱们MemberClass获得的是类簇的类型,KindClass才能获得子类的类型,不少状况下公共类做为抽象类被实现的时候,各个方法都是在子类中具体实现的,所以即便直接生成继承公共类的子类,也不能当即产生用户想要的功能。测试
类簇是多种类别实现抽象化,在公共类的外部只有类簇是可见的,虽然类簇是做为Foundation框架的基本类实现,通常状况下不必生成子类,不过有的时候类簇的基本方法方法不能知足基本需求的时候可使用Category进行扩展,这个以前的文章中有过讲述,若是不是很清晰,能够查看一下。类簇包含了基本的方法,可是具体的实现都是在私有子类中。若是咱们须要新生成子类,能够直接实现已经公开的基本方法。spa
NSString有两个基本的方法:length和characterAtIndex,咱们定义个NSString子类看一下效果:设计
@interface BitPattern : NSString { unsigned char value; } -(id)initWithChar:(char)val; -(NSUInteger)length; -(unichar)characterAtIndex:(NSUInteger)index; @end
实现文件:blog
@implementation BitPattern -(id)initWithChar:(char)val{ self=[super init]; if (self) { value=val; } return self; } -(NSUInteger)length{ return 4; } -(unichar)characterAtIndex:(NSUInteger)index{ return 'K'; } @end
简单调用:继承
NSString *bits; bits=[[BitPattern alloc]initWithChar:'A']; NSLog(@"%@--结果为:%s",[bits class],[bits UTF8String]);
最后的结果为KKKK,关于类簇的子类的实现方法有几个须要考虑的地方:接口
1.肯定私有数据结构,做为超类不能使用全部的数据结构;
2.定义初始化方法,定义init..这样的初始化方法,不能继承和使用init以外的超类的初始化方法;
3.定义构造器,不能继承和使用超类的一样的方法;
4.定义基本方法
5.定义其余方法,经过定义基础方法,公共类声明的方法能够暂且执行,可是利益哦那个生成的数据结构的特征也许可以产生更加高效的方法;
iOS中的类簇也能够理解为简单工厂设计模式的一种具体实现~