1. 程式人生 > 實用技巧 >PHP設計模式之工廠方法*解讀

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. 工廠方法模式就很好的減輕了工廠類的負擔,把某一類/某一種東西交由一個工廠生產;(對應簡單工廠的缺點1)

  2. 同時增加某一類”東西“並不需要修改工廠類,只需要新增生產這類”東西“的工廠即可,使得工廠類符合開放-封閉原則。

  • 缺點:
  1. 相比簡單工廠,實現略複雜。

  2. 對於某些可以形成產品族的情況處理比較複雜。

  對於缺點2,我們可以借用[抽象工廠]來實現。

PHP 網際網路架構師成長之路*「設計模式」終極指南

PHP 網際網路架構師 50K 成長指南+行業問題解決總綱(持續更新)

面試10家公司,收穫9個offer,2020年PHP 面試問題

★如果喜歡我的文章,想與更多資深開發者一起交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入我們的群-點選此處

內容不錯的話希望大家支援鼓勵下點個贊/喜歡,歡迎一起來交流;另外如果有什麼問題和想看的內容可以在評論提出