前面我們介紹了簡單工廠,今天我們繼續學習另外一個工廠——工廠方法。
具體案例:請MM去麥當勞吃漢堡,不同的MM有不同的口味,要每個都記住是一件煩人的事情,我們一般采用FactoryMethod模式,帶著MM到服務員那兒,說“要一個漢堡”,具體要什麼樣的漢堡呢,讓MM直接跟服務員說就行了。
抽象工廠角色(IServerFactory):是工廠方法模式的核心,與應用程序無關。任何在模式中創建的對象的工廠類必須實現這個接口。
具體工廠角色(ChickenLegBaoFactory):這是實現抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,並且受到應用程序調用以創建產品對象。
抽象產品角色(IHanbao):工廠方法模式所創建的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。在上圖中,這個角色是Light。
具體產品角色(ChickenLegBao):這個角色實現了抽象產品角色所定義的接口。某具體產品有專門的具體工廠創建,它們之間往往一一對應。
根據以上UML類圖和角色編寫以下PHP代碼:
; } } /**雞肉漢堡 * Class ChickenBao */ class ChickenBao implements IHanbao { function Allay() { echo I am 雞肉漢堡,小的給主人解餓了! ; } } /**抽象工廠角色 * Interface IServerFactory */ interface IServerFactory { function MakeHanbao(); } /**具體工廠角色 肉松漢堡工廠 * Class RouSongFactory */ class RouSongFactory implements IServerFactory { function MakeHanbao() { return new RouSongBao(); } } class ChickenFactory implements IServerFactory { function MakeHanbao() { return new ChickenBao(); } }
header(Content-Type:text/html;charset=utf-8); //------------------------工廠方式測試代碼------------------ require_once ./FactoryMethod/FactoryMethod.php; //-----------------餐廳廚師----------- $chickenFactory=new ChickenFactory(); $rouSongFactory=new RouSongFactory(); //-----------點餐------------ $chicken1=$chickenFactory->MakeHanbao(); $chicken2=$chickenFactory->MakeHanbao(); $rouSong1=$rouSongFactory->MakeHanbao(); $rouSong2=$rouSongFactory->MakeHanbao(); //------------------顧客吃飯--------- $chicken1->Allay(); $chicken2->Allay(); $rouSong1->Allay(); $rouSong2->Allay();
工廠方法模式優缺點:
優勢:克服了簡單工廠模式違背開放-封閉的原則,保持了封裝對象創建過程的優點。
缺陷:當增加產品時,就得增加一個產品工廠的類,增加額外的開發量。避免不了分支判斷的問題。
簡單工廠模式與工廠方法模式的比較:
1. 結構復雜度
簡單工廠模式要占優。簡單工廠模式只需一個工廠類,而工廠方法模式的工廠類隨著產品類個數增加而增加,從而增加了結構的復雜程度。2.代碼復雜度
代碼復雜度和結構復雜度是一對矛盾,既然簡單工廠模式在結構方面相對簡潔,那麼它在代碼方面肯定是比工廠方法模式復雜的了。簡單工廠模式的工廠類隨著產品類的增加需要增加很多方法(或代碼),而工廠方法模式每個具體工廠類只完成單一任務,代碼簡潔。3.管理上的難度
假如某個具體產品類需要進行一定的修改,很可能需要修改對應的工廠類。當同時需要修改多個產品類的時候,對工廠類的修改會變得相當麻煩。反而簡單工廠沒有這些麻煩,當多個產品類需要修改是,簡單工廠模式仍然僅僅需要修改唯一的工廠類。