爲何使用工廠方法?java
Duck duck=new MallardDuck(); //使用接口讓代碼更具備彈性 //可是仍是創建了具體類的實例
在有一羣相關類時,當場會寫出這樣的代碼算法
Duck duck; if(picnic){ duck=new MallarDuck(); } if(hunting){ duck=new DecoyDuck(); } else if(inBathTub){ duck=new RubberDuck(); }
在不少狀況下,咱們究竟要實例化哪一個具體類,要在運行時有一些條件來決定。當看到這樣的代碼,一旦有變化或者擴展,就必須從新打開這段代碼進行檢查修改。一般這樣修改過的代碼將早場部分系統更難維護和更新,並且也更容易犯錯。spa
直接使用new不符合「對修改關閉」的原則,咱們應該依據「找出會變化的原則,把它們從不變的部分分離出來」的原則寫代碼。設計
解決方案:code
什麼是工廠方法?對象
工廠方法模式:定義了一個建立對象的接口,但由子類決定要實例化的類是哪個。工廠方法讓類把實例化推遲到子類。接口
抽象工廠模式:提供一個接口,用於建立相關或依賴對象的家族,而不須要明確指定特定類。產品
原則:依賴抽象,不要依賴具體類。class
目的:爲了獲得更鬆的耦合,更有彈性的設計。擴展
簡單的理解:
實例 -> 類 -> 類工廠
實例 -> 類 -> 類工廠 -> 抽象工廠
工廠方法是個方法,是在提供的抽象接口中,用來建立「一個產品」的方法。
createPizza();
而後具體子類,經過實現此接口來實現這個createPizze()的具體方法。
抽象工廠是個接口,在接口中,建立「不少產品」(或者說一個產品家族,由於產品之間有必定的聯繫)。
createDough(); createSauce(); createCheese(); //多個產品,可是相互之間有聯繫,都是一種披薩的配料
而後具體子類,經過實現此接口來實現建立這個產品家族,而其中每個create方法,均可以使用工廠方法來實現。
能夠說抽象工廠的實現中,運用到了工廠方法。
換句話說:抽象工廠的任務是定義一個負責建立一組產品的接口,這個接口內的每個方法都負責建立一個具體產品,同時咱們利用實現抽象工廠的子類來提供這些具體的算法。因此,在抽象工廠中利用工廠方法實現生產方法是至關天然的作法。