類簇能夠說是Objective-C語言中比較重要的設計,Apple在官方文檔中用一篇文章來介紹這個概念,儘管文章點到爲止,並無深刻到內部機制,可是也用了詳細的例子來講明類簇的設計是多麼優秀。Apple在文檔中稱類簇是基於抽象工廠模式來設計的,若是你對抽象工廠的定義不清晰,可能會問,抽象工廠是什麼?若是你對抽象工廠的定義清晰,有可能會問,類簇的設計真的是基於抽象工廠模式嗎?本文站在設計模式的源頭,對類簇進行挖掘解讀。設計模式
工廠模式一共有三種,簡單工廠模式,工廠方法模式,抽象工廠模式。接下來咱們依次經過圖文並茂的描述進行理解架構
簡單工廠模式iphone
先來看看簡單工廠的UML圖設計
咱們將簡單工廠模式分爲幾個部分來解讀:3d
定義了一個抽象的產品類cdn
有兩個具體產品類繼承了該抽象類對象
creatProduct(String):Product方法:參數爲String類型,返回值爲Product類型blog
僞代碼實現: if(type == "A") { return new ProductA(); } else { return new ProductB(); }繼承
僞代碼示例:ip
Product product = factory.creatProduct("A"); product.operation();
能夠發現,主要的邏輯代碼寫在了工廠的方法中,那麼若是產品種類增多,咱們就須要去修改工廠的方法。回憶一下設計模式六大原則之一的開放-封閉原則,開放指的是面向擴展開放,封閉指的是面向修改封閉。再回到簡單工廠模式來看,是否是違背了原則呢。因此在實際應用中,正如它的名字,它僅僅在一些簡單場景使用。
一樣地,咱們先來看看工廠方法模式的UML圖
一樣地,將其分爲幾個部分來解讀:
定義了一個抽象的產品類 有兩個具體產品類繼承了該抽象類
定義了一個抽象的工廠類 有兩個具體工廠類繼承了該抽象類
FactoryA類中的+ creatProduct():Product方法僞代碼:
return new ProductA();
FactoryB類中的creatProduct():Product方法僞代碼:
return new ProductB();
僞代碼演示: // 建立產品A Factory factoryA = new FactoryA(); Product productA = factoryA.creatProduct(); // 建立產品B Factory factoryB = new FactoryB(); Product productB = factoryB.creatProduct();
看完了簡單工廠模式和工廠方法模式,經過對比能夠發現,工廠方法模式在簡單工廠模式的基礎之上,踐行了開放-封閉原則,建立產品再也不經過傳入參數判斷應該生成哪一個具體產品,而是將工廠建立產品的任務放在了子類去作。當增長了新的產品時,咱們只須要建立新的子類,實現方法,不須要對抽象類進行修改。
老樣子,來看看抽象工廠的UML圖
分紅三部分來解讀抽象工廠模式:
有兩個抽象的產品類
有兩個具體產品類分別繼承了各自的抽象類
定義了一個抽象的工廠類
有兩個具體工廠類繼承了該抽象類
建立產品的方法,以Factory1類示例:
creatProductA():ProductA方法的僞代碼:
return new ProductA1();
creatProductB():ProductB方法的僞代碼:
return new ProductB1();
僞代碼演示:
// 型號爲1的產品 Factory factory1 = new Factory1();
ProductA productA1 = factory1.creatProductA();
ProductB productB1 = factory1.creatProductB();
// 型號爲2的產品
Factory factory2 = new Factory2();
ProductA productA2 = factory2.creatProductA();
ProductB productB2 = factory2.creatProductB();
能夠發現,抽象工廠模式其實就是在工廠方法模式的基礎上增長了產品的種類,產品的抽象類從一個變成了多個,那麼這樣一來,產品就構成了一個體系。這個體系有兩個關鍵詞,產品簇和產品等級結構,爲了理解這兩個關鍵字,咱們先來看個實際的例子
產品等級結構: 等級結構就是繼承結構,如上圖中手機和電腦,有一個抽象類,而後具體的產品繼承這個抽象類
產品簇: 上圖中iphoneX和MacBook Pro都是產於同一個公司,蘋果公司。而小米MIX和小米筆記本Pro也是產於同一家公司。即產品簇的概念是,產於同一家工廠,位於不一樣產品等級結構中的一組產品。
有了以上的準備知識以後,咱們來看看Objective-C中的類簇設計
在官方文檔中,蘋果僅僅告訴咱們類簇是基於抽象工廠模式來設計的
來看下NSNumber,它是Objective-C中關於數據類型的封裝類
從這個UML圖來看,貌似和簡單工廠模式差很少呢,可是細心觀察,這裏並無像簡單工廠模式同樣違背了開放-封閉原則。在工廠類NSPlaceholderNumber中,提供了建立不種類產品的方法。這點和抽象工廠很像。那和抽象工廠不同的地方呢?
和抽象工廠的對比
仔細地想下,NSNumber的UML架構就彷彿是將抽象工廠模式中以工廠爲單位分割出來的小單位。回到小米和蘋果的那個例子,就好像其中的一個產品簇,例如只有蘋果公司以及它的iphoneX和MacBook Pro。嘿嘿,看到這裏,NSNumber的抽象工廠設計的神祕面紗悄悄地揭開了。
爲什麼這麼設計?
剛剛提到了,NSNumber目前只是產品簇中的一條產品線。那麼若是之後產生了其餘類型的產品線,蘋果不須要修改以前的代碼,只須要添加另外的工廠和另外的產品線,將開放-封閉原則發揮地玲離盡致。