類簇(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中的類簇也能夠理解爲簡單工廠設計模式的一種具體實現~