類簇

類簇能夠說是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中關於數據類型的封裝類

對於這個層級的使用者,僅僅能看到一個共有類,那就是NSNumber,因此要分配內存建立合適的子類對象,又怎麼可能呢?答案就是這個抽象父類對如何分配進行了處理。抽象父類務必須要定義建立私有子類的方法,這是抽象父類的職責。抽象父類須要基於你們調用的建立方法去分配內存到合適的子類,同時使用者不須要也不能選擇對象的類型,統一使用NSNumber來管理。

是簡單工廠嗎?

從這個UML圖來看,貌似和簡單工廠模式差很少呢,可是細心觀察,這裏並無像簡單工廠模式同樣違背了開放-封閉原則。在工廠類NSPlaceholderNumber中,提供了建立不種類產品的方法。這點和抽象工廠很像。那和抽象工廠不同的地方呢?

和抽象工廠的對比

仔細地想下,NSNumber的UML架構就彷彿是將抽象工廠模式中以工廠爲單位分割出來的小單位。回到小米和蘋果的那個例子,就好像其中的一個產品簇,例如只有蘋果公司以及它的iphoneX和MacBook Pro。嘿嘿,看到這裏,NSNumber的抽象工廠設計的神祕面紗悄悄地揭開了。

爲什麼這麼設計?

剛剛提到了,NSNumber目前只是產品簇中的一條產品線。那麼若是之後產生了其餘類型的產品線,蘋果不須要修改以前的代碼,只須要添加另外的工廠和另外的產品線,將開放-封閉原則發揮地玲離盡致。

相關文章
相關標籤/搜索