類簇是Foundation框架中廣泛使用的設計模式。類簇將一些私有的、具體的子類組合在一個公共的、抽象的超類下面,以這種方法來組織類可以簡化一個面向對象框架的公開架構,而又不減少功能的豐富性。

在類簇中創(chuàng)建子類

類簇架構是具有簡潔性和可擴展性之間的一個折衷。用幾個公共類代表多個私有類可以使框架中的類易學易用,但是在某種程度上增加創(chuàng)建類簇子類的難度。然而如果很少需要創(chuàng)建子類,則類簇架構則有明確的好處。Foundation框架只在這種情況下使用類簇。

如果您發(fā)現(xiàn)某個類簇沒有提供您的程序需要的功能,則可能適合引入一個子類。舉例來說,假定您希望創(chuàng)建一個數(shù)組對象,其存儲是基于文件的,而不是如NSArray類簇那樣是基于內存的。由于您需要改變類的存儲機制,所以需要創(chuàng)建子類。

另一方面,在某些情況下可能定義一個擁有類簇對象的類就夠了(而且更加容易)。假定您的程序需要在某些數(shù)據(jù)被修改的時候得到通知,則為Foundation框架中定義的數(shù)據(jù)對象創(chuàng)建一個簡單的包裝類可能是最好的方法。該類的對象可以干預修改數(shù)據(jù)的消息,將它截獲并進行必要的動作,然后再轉發(fā)給嵌入的數(shù)據(jù)對象。

總的來說,如果您需要管理對象的存儲,就創(chuàng)建一個真的子類。否則,就創(chuàng)建一個合成對象,即將標準的Foundation框架對象嵌入到您自己設計的對象中。

類簇的概念

類簇 是一群隱藏在通用接口下的與實現(xiàn)相關的類,使得我們編寫的代碼可以獨立于底層實現(xiàn)(因為接口是穩(wěn)定的)。

如創(chuàng)建NSString對象時,你得到的可能是NSLiteralString,NSCFString,NSSimpleCString等。即不同的NSString對象調用同一個接口A,接口A的實現(xiàn)可能是不同的。

在Foundation框架中,常見的類簇有NSString,NSArray,NSDictionary等。想要在類簇中創(chuàng)建子類會困難一些,必須是抽象超類的子類,必須重載超類的原始方法,必須聲明自己的數(shù)據(jù)存儲。最方便的是使用組合或者類別來代替子類化。

類簇架構代表一個反映簡單概念的設計。

類簇中的抽象超類必須聲明創(chuàng)建其私有子類的方法。根據(jù)調用的創(chuàng)建方法分配正確類型的對象是超類的責任。在Foundation框架中,通常通過調用+ className...或alloc...和init...方法來創(chuàng)建對象。以Foundation框架的NSNumber類為例,可以發(fā)送如下的消息來創(chuàng)建數(shù)字對象:

NSNumber *aChar = [NSNumber numberWithChar:’a’];
NSNumber *anInt = [NSNumber numberWithInt:1];
NSNumber *aFloat = [NSNumber numberWithFloat:1.0];
NSNumber *aDouble = [NSNumber numberWithDouble:1.0];