(1)模式的功能
工廠方法的主要功能是讓父類在不知道具體實現的情況下,完成自身的功能呼叫,而具體的實現延遲到子類來實現。
這樣在設計的時候,不用去考慮具體的實現,需要某個物件,把它通過工廠方法返回就好了,在使用這些物件實現功能的時候還是通過介面來操作,這非常類似於ioc/di的思想,這個在後面給大家稍詳細點介紹一下。
(2)實現成抽象類
工廠方法的實現中,通常父類會是乙個抽象類,裡面包含建立所需物件的抽象方法,這些抽象方法就是工廠方法。
這裡要注意乙個問題,子類在實現這些抽象方法的時候,通常並不是真的由子類來實現具體的功能,而是在子類的方法裡面做選擇,選擇具體的產品實現物件。
父類裡面,通常會有使用這些產品物件來實現一定的功能的方法,而且這些方法所實現的功能通常都是公共的功能,不管子類選擇了何種具體的產品實現,這些方法的功能總是能正確執行。
(3)實現成具體的類
當然也可以把父類實現成為乙個具體的類,這種情況下,通常是在父類中提供獲取所需物件的預設實現方法,這樣就算沒有具體的子類,也能夠執行。
通常這種情況還是需要具體的子類來決定具體要如何建立父類所需要的物件。也把這種情況稱為工廠方法為子類提供了掛鉤,通過工廠方法,可以讓子類物件來覆蓋父類的實現,從而提供更好的靈活性。
(4)工廠方法的引數和返回
工廠方法的實現中,可能需要引數,以便決定到底選用哪一種具體的實現。也就是說通過在抽象方法裡面傳遞引數,在子類實現的時候根據引數進行選擇,看看究竟應該建立哪乙個具體的實現物件。
一般工廠方法返回的是被建立物件的介面物件,當然也可以是抽象類或者乙個具體的類的例項。
(5)誰來使用工廠方法建立的物件
這裡首先要搞明白一件事情,就是誰在使用工廠方法建立的物件?
事實上,在工廠方法模式裡面,應該是creator中的其它方法在使用工廠方法建立的物件,雖然也可以把工廠方法建立的物件直接提供給creator外部使用,但工廠方法模式的本意,是由creator物件內部的方法來使用工廠方法建立的物件,也就是說,工廠方法一般不提供給creator外部使用。
客戶端應該是使用creator物件,或者是使用由creator建立出來的物件。對於客戶端使用creator物件,這個時候工廠方法建立的物件,是creator中的某些方法使用。對於使用那些由creator建立出來的物件,這個時候工廠方法建立的物件,是構成客戶端需要的物件的一部分。分別舉例來說明。
①客戶端使用creator物件的情況
比如前面的示例,對於「實現匯出資料的業務功能物件」的類exportoperate,它有乙個export的方法,在這個方法裡面,需要使用具體的「匯出的檔案物件的介面物件」 exportfileapi,而exportoperate是不知道具體的exportfileapi實現的,那麼怎麼做的呢?就是定義了乙個工廠方法,用來返回exportfileapi的物件,然後export方法會使用這個工廠方法來獲取它所需要的物件,然後執行功能。
這個時候的客戶端是怎麼做的呢?這個時候客戶端主要就是使用這個exportoperate的例項來完成它想要完成的功能,也就是客戶端使用creator物件的情況,簡單描述這種情況下的**結構如下:
/** *客戶端使用creator物件的情況下,creator的基本實現結構
*/ public
abstract class creator }
②客戶端使用由creator建立出來的物件
另外一種是由creator向客戶端返回由「工廠方法建立的物件」來構建的物件,這個時候工廠方法建立的物件,是構成客戶端需要的物件的一部分。簡單描述這種情況下的**結構如下:
/** *客戶端使用creator來建立客戶端需要的物件的情況下,creator的基本實現結構
*/ public
abstract class creator }
小結一下:在工廠方法模式裡面,客戶端要麼使用creator物件,要麼使用creator建立的物件,一般客戶端不直接使用工廠方法。當然也可以直接把工廠方法暴露給客戶端操作,但是一般不這麼做。
(6)工廠方法模式的呼叫順序示意圖
由於客戶端使用creator物件有兩種典型的情況,因此呼叫的順序示意圖也分做兩種情況,先看看客戶端使用由creator建立出來的物件情況的呼叫順序示意圖,如圖.5所示:
圖5 客戶端使用由creator建立出來的物件的呼叫順序示意圖
接下來看看客戶端使用creator物件時候的呼叫順序示意圖,如圖6所示:
圖6 客戶端使用creator物件的呼叫順序示意圖
未完待續......
研磨設計模式之工廠方法模式 2
用來解決上述問題的乙個合理的解決方案就是工廠方法模式。那麼什麼是工廠方法模式呢?1 工廠方法模式定義 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類,factory method使乙個類的例項化延遲到其子類。2 應用工廠方法模式來解決的思路 仔細分析上面的問題,事實上在實現匯出資料的業務功能物...
研磨設計模式之工廠方法模式 5
1 什麼是平行的類層次結構呢?簡單點說,假如有兩個類層次結構,其中乙個類層次中的每個類在另乙個類層次中都有乙個對應的類的結構,就被稱為平行的類層次結構。舉個例子來說,硬碟物件有很多種,如分成台式電腦硬碟和筆記本硬碟,在台式電腦硬碟的具體實現上面,又有希捷 西數等不同品牌的實現,同樣在筆記本硬碟上,也...
研磨設計模式之工廠方法模式 2
size medium 2 解決方案 size 2.1 工廠方法模式來解決 用來解決上述問題的乙個合理的解決方案就是工廠方法模式。那麼什麼是工廠方法模式呢?1 工廠方法模式定義 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類,factory method使乙個類的例項化延遲到其子類。2 應用工...