在前面博主寫的文章:設計模式-----簡單工廠模式,發現簡單工廠模式存在一系列問題:html
爲了解決上述的問題,咱們又使用了一種新的設計模式:工廠方法模式java
工廠方法模式,又稱工廠模式、多態工廠模式和虛擬構造器模式,經過定義工廠父類負責定義建立對象的公共接口,而子類則負責生成具體的對象數據庫
將類的實例化(具體產品的建立)延遲到工廠類的子類(具體工廠)中完成,即由子類來決定應該實例化(建立)哪個類設計模式
工廠一旦須要生產新產品就須要修改工廠類的方法邏輯,違背了「開放 - 關閉原則ide
組成(角色) | 關係 | 做用 |
---|---|---|
抽象產品(Product) | 具體產品的父類 | 描述具體產品的公共接口 |
具體產品(Concrete Product) | 抽象產品的子類;工廠類建立的目標類 | 描述生產的具體產品 |
抽象工廠(Creator) | 具體工廠的父類 | 描述具體工廠的公共接口 |
具體工廠(Concrete Creator) | 抽象工廠的子類;被外界調用 | 描述具體工廠;實現FactoryMethod工廠方法建立產品的實例 |
abstract class Factory{ public abstract Product Manufacture(); }
abstract class Product{ public abstract void Show(); }
//具體產品A類 class ProductA extends Product{ @Override public void Show() { System.out.println("生產出了產品A"); } } //具體產品B類 class ProductB extends Product{ @Override public void Show() { System.out.println("生產出了產品B"); } }
//工廠A類 - 生產A類產品 class FactoryA extends Factory{ @Override public Product Manufacture() { return new ProductA(); } } //工廠B類 - 生產B類產品 class FactoryB extends Factory{ @Override public Product Manufacture() { return new ProductB(); } }
//生產工做流程 public class FactoryPattern { public static void main(String[] args){ //客戶要產品A FactoryA mFactoryA = new FactoryA(); mFactoryA.Manufacture().Show(); //客戶要產品B FactoryB mFactoryB = new FactoryB(); mFactoryB.Manufacture().Show(); } }
生產出了產品A 生產出了產品B
簡單工廠模式須要修改工廠類的判斷邏輯ui
簡單工廠中的工廠類存在複雜的switch邏輯判斷設計
簡單工廠模式的工廠類使用靜態工廠方法code
總結:htm
工廠模式能夠說是簡單工廠模式的進一步抽象和拓展,在保留了簡單工廠的封裝優勢的同時,讓擴展變得簡單,讓繼承變得可行,增長了多態性的體現對象
雖然保證了工廠方法內的對修改關閉,但對於使用工廠方法的類,若是要更換另一種產品,仍然須要修改實例化的具體工廠類
一個具體工廠只能建立一種具體產品