PHP設計模式之工廠方法*解讀
「PHP」工廠方法是針對每一種產品提供一個工廠類。通過不同的工廠例項來建立不同的產品例項。
相比簡單工廠 ,建立物件這件事不再交由一個類來建立:把簡單工廠拆分,每個產品由專門的一個簡單工廠來實現,每個簡單工廠實現工廠介面類。這樣實現在同一等級結構中,支援增加任意產品。
工廠方法UML圖:
★官方PHP高階學習交流社群「點選」管理整理了一些資料,BAT等一線大廠進階知識體系備好(相關學習資料以及筆面試題)以及不限於:分散式架構、高可擴充套件、高效能、高併發、伺服器效能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell指令碼、Docker、微服務、Nginx等多個知識點高階進階乾貨
簡單工廠需要有4個角色:
-
Product介面類:用於定義產品規範;
-
具體的產品實現,例如ConcreateProductA、ConcreateProductB;
-
抽象工廠類IFactory:用於規範工廠;
-
具體產品建立的簡單工廠,例如ConcreateFactoryA、ConcreateFactoryB。
程式碼: ICar.php:定義產品規範:
namespace Yjc\SimpleFactory;
interface ICar
{
public function driver();
}
具體產品實現:
namespace Yjc\SimpleFactory; class Benz implements ICar { public function driver() { echo 'benz driver.'; } } class Bmw implements ICar { public function driver() { echo 'bmw driver.'; } }
抽象工廠類IFactory:
namespace Yjc\Factory;
interface IFactory
{
public static function makeCar();
}
具體工廠實現:
namespace Yjc\Factory; class FactoryBenz implements IFactory { public static function makeCar() { return new Benz(); } } class FactoryBmw implements IFactory { public static function makeCar() { return new Bmw(); } }
測試:
$car = Factory\FactoryBenz::makeCar();
$car->driver();
思考:如果不使用工廠模式來實現我們的例子,也許程式碼會減少很多——只需要實現已有的車,不使用多型。但是在可維護性上,可擴充套件性上是非常差的(你可以想象一下新增一輛車後要牽動的類)。因此為了提高擴充套件性和維護性,多寫些程式碼是值得的,尤其是複雜專案裡。
- 優點:
-
工廠方法模式就很好的減輕了工廠類的負擔,把某一類/某一種東西交由一個工廠生產;(對應簡單工廠的缺點1)
-
同時增加某一類”東西“並不需要修改工廠類,只需要新增生產這類”東西“的工廠即可,使得工廠類符合開放-封閉原則。
- 缺點:
-
相比簡單工廠,實現略複雜。
-
對於某些可以形成產品族的情況處理比較複雜。
對於缺點2,我們可以借用[抽象工廠]來實現。
PHP 網際網路架構師 50K 成長指南+行業問題解決總綱(持續更新)
面試10家公司,收穫9個offer,2020年PHP 面試問題
★如果喜歡我的文章,想與更多資深開發者一起交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入我們的群-點選此處。
內容不錯的話希望大家支援鼓勵下點個贊/喜歡,歡迎一起來交流;另外如果有什麼問題和想看的內容可以在評論提出