在NSNumber中用到了經常使用的一種設計模式-抽象工廠模式, 這也是NSNumber能很好的將c語言中各類基本數據類型封裝成對象的緣由之一. 那麼什麼是抽象工廠模式呢? 抽象工廠模式又在什麼時候使用以及如何使用. 下面我來談談我讀完書後對它的理解,objective-c
抽象工廠模式的標準定義是提供一系列建立相關或或相互依賴對象的接口, 而無需指定他們具體的類.設計模式
舉個咱們常見的例子來講好比披薩. 披薩的種類特別多好比意大利披薩, 芝加哥披薩等等. 不一樣的披薩里面的肉, 醬汁都會有所不一樣, 可是他們都具備共同特色好比麪包, 醬, 奶酪. 而咱們就把這些共同特色抽象成一種食物類型披薩. 它定義了披薩基本特徵即共有特色, 製做披薩餅的師傅均可以稱做「抽象」的披薩餅廚師. 而具體制做意大利披薩,芝加哥披薩的廚師則能夠看做「具體」的披薩餅廚師, 這些廚師能作出特定類型的一種披薩, 咱們消費者只須要點特定一種披薩可是不須要知道具體知道每種披薩是怎麼作出來的,markdown
上述例子中披薩廚師就能夠視做抽象工廠, 而意大利披薩,芝加哥披薩的廚師能夠看做具體的工廠, 廚師們知道披薩的基本特徵, 製做披薩時都會按照基本的製做披薩的規則, 可是不一樣披薩廚師的作法又會有所不一樣, 他們以本身特定風味生廠出特定一種披薩餅.spa
再看一個更具體的例子就能很好理解抽象工廠.以下圖所示:設計
咱們這裏如今有一個抽象的品牌工廠類BrandingFactory, 而後他有兩個具體工廠類SlerraBrandingFactory和AcmeBrandingFactory, 他們負責建立不一樣品牌的視圖組合(View, Button, Toobar), 具體工廠類在建立具體產品時會一些有不一樣的作法(好比會加入各自的品牌標誌). 然而調用者只知道 BrandingFactory、UIView、UIButton、 UIToobar這四個類, 而不知道內部實現細節的具體類. 使用者只須要使用BrandingFactory的factory方法建立一個抽象工廠類的實例, 而後經過一些參數告訴抽象工廠你想要生廠哪一種產品. 抽象工廠就會讓具體工廠生產出一種品牌的視圖組合, 而後調用工廠方法就能得到視圖View、Button或者Toobar.code
具體使用爲下列代碼:orm
BrandingFactory *slerraBrandingFactory = [BrandingFactory factory];
/**這裏還須要額外操做告訴抽象工廠你想要生廠哪一種產品*/
UIView *view = [slerraBrandingFactory brandView];
複製代碼
NSNumber類中爲咱們提供了不少類方法用於建立各類類型的NSNumber對象. 像下面這樣對象
NSNumber *boolNumber = [NSNumber numberWithBool:YES];
NSNumber *charNumber = [NSNumber numberWithChar:'a'];
NSNumber *intNumber = [NSNumber numberWithInt:1];
NSNumber *doubleNumber = [NSNumber numberWithDouble:1.0];
複製代碼
不一樣的工廠方法實際會創造出屬於不一樣具體工廠類的對象, 咱們能夠使用NSLog打印一下每一個對象所屬類的描述.接口
NSLog(@"%@", [[boolNumber class]description]);
NSLog(@"%@", [[charNumber class]description]);
NSLog(@"%@", [[intNumber class]description]);
NSLog(@"%@", [[doubleNumber class]description]);
複製代碼
打印結果以下: ip
從打印結果能夠看出來對象所屬的類確實不是都相同的. NSCFBoolean和NSCFNumber就是NSNumber的具體子類. 上述四個對象就是具體子類的實例, 可是它們都支持NSNumber的公有接口.
雖然他們屬於不一樣的具體子類, 可是其行爲都有抽象超類NSNumber定義. 咱們嘗試執行下面的代碼段看看.
NSLog(@"%d", [boolNumber intValue]);
NSLog(@"%@", [charNumber boolValue] ? @"YES": @"NO");
複製代碼
控制檯輸出:
boolNumber內部保持了布爾值YES, 但仍實現了公有intValue方法, 返回反映其內部布爾值的合適整形值, 一樣charNumber也實現了公有boolValue方法, 返回反映其內部字符值‘a’的合適布爾值.
接受不一樣類型的參數值並返回NSNumber實例的使用了類工廠方法. 使用numberWithBool就建立NSCFBoolean工廠的實例, 使用numberWithInt就建立NSCFNumber的實例, 而後他們都實現了NSNumber抽象工廠類對象的的公有方法好比intValue、boolValue. 然而咱們調用時並不知道它到底實際屬於NSCFBoolean仍是NSCFNumber, 只須要把它看成NSNumber的實例, 而且調用它提供的公有方法.