工廠方法模式factory method,又稱多型性工廠模式。在工廠方法模式中,核心的工廠類不再負責所有的產品的建立,而是將具體建立的工作交給子類去做。該核心類成為乙個抽象工廠角色,僅負責給出具體工廠子類必須實現的介面,而不接觸哪乙個產品類應當被例項化這種細節。
意圖
定義乙個使用者建立物件的介面,讓子類決定例項化哪乙個類,工廠方法模式使乙個類的例項化延遲到其子類。
參與者
抽象產品角色(product):定義產品的介面
具體產品角色(concreteproduct) :實現介面product的具體產品類
抽象工廠角色(creator) :宣告工廠方法(factorymethod),返回乙個產品
真實的工廠(concretecreator):實現factorymethod工廠方法,由客戶呼叫,返回乙個產品的例項
工廠方法模式uml圖
同樣拿吃水果的例子,如果使用簡單工廠模式
public void eat()
}
public class banana implements fruit
}
public class fruitfactory else if (type.equalsignorecase("banana")) else }}
如果我們新加了乙個水果 梨子 ,那麼我們就要新建立乙個pear類
public class pear implements fruit
}
在工廠類中應該加入建立梨子的例項的判斷
public class fruitfactory else if (type.equalsignorecase("banana")) else if(type.equalsignorecase("pear")) else }}
public static void main(string args)
執行結果
吃蘋果吃香蕉
吃梨新增乙個產品,需要修改工廠類的原始碼,這樣就不符合開放封閉原則,那麼我們使用簡單工廠模式
public inte***ce fruitfactory
@override
public fruit getfruit()
}
public class bananafactory implements fruitfactory
}
想要擴充套件,只需要新建乙個對應的factory去實現fruitfactory就可以了
public class pea***ctory implements fruitfactory
}
public static void main(string args)
執行結果:
吃蘋果吃香蕉
吃梨工廠方法模式與簡單工廠模式比較
工廠方法的核心是乙個抽象工廠類,而簡單工廠模式吧核心剛在乙個具體類上
工廠方法模式具體工廠類都有乙個共同的介面或者有共同的抽象類
當系統擴充套件需要新增新的產品物件時,僅僅需要新增乙個具體的物件一級乙個具體工廠物件,原有的工廠物件不需要進行任何修改,很好的符合開放封閉原則,而簡單工廠模式在新增新產品物件後不得不修改工廠方法,擴充套件性不好
工廠方法模式的優點
在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被例項化這一細節,使用者只需要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。
基於工廠角色和產品角色的多型性設計是工廠方法模式的關鍵。它能夠使工廠可以自主確定建立何種產品物件,而如何建立這個物件的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多型工廠模式,是因為所有的具體工廠類都具有同一抽象父類。
使用工廠方法模式的另乙個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的介面,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要新增乙個具體工廠和具體產品就可以了。這樣,系統的可擴充套件性也就變得非常好,完全符合「開閉原則」。
工廠方法模式的缺點
在新增新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和執行,會給系統帶來一些額外的開銷。
由於考慮到系統的可擴充套件性,需要引入抽象層,在客戶端**中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到dom、反射等技術,增加了系統的實現難度。
模式適用環境
在以下情況下可以使用工廠方法模式:
乙個類不知道它所需要的物件的類:在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體的產品物件由具體工廠類建立;客戶端需要知道建立具體產品的工廠類。
乙個類通過其子類來指定建立哪個物件:在工廠方法模式中,對於抽象工廠類只需要提供乙個建立產品的介面,而由其子類來確定具體要建立的物件,利用物件導向的多型性和黎克特制代換原則,在程式執行時,子類物件將覆蓋父類物件,從而使得系統更容易擴充套件。
將建立物件的任務委託給多個工廠子類中的某乙個,客戶端在使用時可以無須關心是哪乙個工廠子類建立產品子類,需要時再動態指定,可將具體工廠類的類名儲存在配置檔案或資料庫中。
工廠方法模式 工廠方法模式
工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...
工廠方法模式 工廠方法模式 二
工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...
工廠方法模式(一) 簡單工廠方法模式
ps 第二篇學習部落格,堅持就是勝利。繼續設計模式的學習,記錄工廠模式,加深自己的理解。基本結構 abstractproduct 用來定義基本的商品的抽象 public abstract class abstractphoneproduct 用來實現抽象商品,生成各種商品 public class ...