參考書——《HeadFirst設計模式》
(提醒:在設計模式中,所謂的“實現一個接口”,並不一定表示“寫一個類,並利用implements關鍵字來實現某個Java接口”。“實現一個接口”泛指:實現某個超類型(可以是類or接口)的某個方法)
工廠方法用來處理對象的創建,並將這樣的行爲分裝在子類中。這樣,客戶端程序中關於超類的代碼就和子類對象創建代碼解耦了。
abstract Product factoryMethod (String Type) ;
1.工廠方法是抽象的,所以依賴子類來處理對象的創建。
2.工廠方法必須返回一個產品。超類中定義的方法,通常使用到工廠方法的返回值。
3.工廠方法將客戶和實際創建具體產品的代碼分隔開來。
4.工廠方法可能需要(也可能不需要)參數來指定所要的產品。
Factory Method Pattern 通過讓子類決定該創建的對象是什麼,來達到將對象創建的過程封裝的目的。
正式定義:工廠方法模式定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。
抽象的創建者類(Creator)提供了一個創建對象的方法接口(也成爲“工廠方法”),在抽象的Creator中,任何其他實現的方法,都可能使用到這個工廠方法所生產出來的產品。但只有子類正真實現這個方法並生產產品。
定義中的“決定”,並不是指模式允許子類本身在運行時做決定,而是指在編寫創建者類時,不需要知道實際創建的產品是哪一個,選擇了使用了哪個子類,自然就決定了實際創建的產品是哪一個。
Creator這個抽象類實現了所有操縱產品的方法,但不實現工廠方法。
來看下它的組成:
2)具體工廠角色:它含有和具體業務邏輯有關的代碼。
3)抽象產品角色:它是具體產品繼承的父類或者是實現的接口。在java中一般有抽象類或者接口來實現。
4)具體產品角色:具體工廠角色所創建的對象就是此角色的實例。
當你直接實例化一個對象時,就是在依賴它的具體類。
這裏插入些依賴倒置的一些知識 依賴倒置——不能讓高層組件依賴低層組件,而且,不管是高層or低層組件,都應該依賴於抽象。所謂高層組件是由其他低層組件定義其行爲的類。
======================================================================================================
再補充下簡單工廠模式(因爲《HeadFirst設計模式》中沒有單獨來說),又稱靜態工廠方法模式(Static Factory MethodPattern)。
簡單工廠涉及到三個角色: