淺談PHP中的簡單工廠模式

青灯夜游
發布: 2023-04-10 08:26:01
轉載
3801 人瀏覽過

本篇文章帶大家了解一下PHP設計模式中的簡單工廠模式。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

淺談PHP中的簡單工廠模式

先從簡單工廠入門,不管是面試還是被他人面試,在問到設計模式的時候,大多數人都會提到工廠模式。毫無疑問,工廠相關的幾種模式在設計模式中最有名的也是應用比較廣泛的一種模式。在GoF設計模式中也都是屬於創建型的模式。

但是,能夠說明白簡單工廠工廠模式抽象工廠模式這三種模式的人還真能讓面試官刮目相看。這裡有個前提,是你真的能說明白,大部分人,包括在深入研究設計模式之前,我也沒辦法說清楚。不管是我去面試,還是面試別人。當我面試別人的時候,能講個大概也就差不多了。而我去面試的時候,也就是類似的講個大概。經歷不少挫折之後才有了想深入的研究研究設計模式的想法,於是便會產生這一系列的文章。從這篇簡單工廠開始,我們一起再次深入的設計模式學習。

當然,這裡用的是PHP。

解釋

簡單工廠,也稱為靜態工廠,不屬於GoF23種設計模式。但可以說是所有的設計模式中大家可能最容易理解,也可能在你的程式碼中早就已經用過不知道多少次的一種設計模式了。我們先從一個最簡單的程式碼段來看。

// Factory
class Factory
{
    public static function createProduct(string $type) : Product
    {
        $product = null;
        switch ($type) {
            case 'A':
                $product = new ProductA();
                break;
            case 'B':
                $product = new ProductB();
                break;
        }
        return $product;
    }
}
登入後複製

沒錯,核心點就是中間那段簡單的switch程式碼,我們在回傳值類型中固定為Product介面的實作。

在這段程式碼中,使用了PHP新特性,參數類型返回值類型

##產品接口和產品實作

// Products
interface Product
{
    public function show();
}

class ProductA implements Product
{
    public function show()
    {
        echo 'Show ProductA';
    }
}

class ProductB implements Product
{
    public function show()
    {
        echo 'Show ProductB';
    }
}
登入後複製

最後客戶端的使用就很簡單了

// Client
$productA = Factory::createProduct('A');
$productB = Factory::createProduct('B');
$productA->show();
$productB->show();
登入後複製

從以上程式碼可以看出,其實這裡就是一個工廠類別根據我們傳入的字串或其他你自己定義的標識符,來傳回對應的產品(Product物件)。


形象化一點的比喻:我是一個賣手機的批發商(客戶Client,業務方),我需要一批手機(產品Product),於是我去讓富士康(工廠Factory)來幫我生產。我下了訂單($type變數)指明型號,然後富士康就給我對應型號的手機,然後我就繼續我的工作了,和富士康的合作還真是挺愉快的。

這裡比較規範的寫法可能是所有產品都會去實作一個統一的接口,然後客戶端只知道接口的方法統一呼叫即可。不規範的話也可以不使用接口,返回各種不同的對象,類似於外觀(Facade)模式進行統一的門面管理。

淺談PHP中的簡單工廠模式

原始碼位址:簡單工廠基礎類別圖實作

https://github.com/zhangyue0503/designpatterns-php/blob/master /01.simple-factory/source/simple-factory.php

#實例

場景:簡訊傳送功能模組。現在我們使用了三個商家的,分別是阿里雲、蝶信、極光的短信服務,在不同業務中可能使用不同的短信發送商,使用簡單工廠可以方便的完成這個需求。

類別圖:

淺談PHP中的簡單工廠模式

#程式碼:

<?php

interface Message {
    public function send(string $msg);
}

class AliYunMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;阿里云短信(原阿里大鱼)发送成功!短信内容:&#39; . $msg;
    }
}

class BaiduYunMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;百度SMS短信发送成功!短信内容:&#39; . $msg;
    }
}

class JiguangMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;极光短信发送成功!短信内容:&#39; . $msg;
    }
}

Class MessageFactory {
    public static function createFactory($type){
        switch($type){
            case &#39;Ali&#39;:
                return new AliYunMessage();
            case &#39;BD&#39;:
                return new BaiduYunMessage();
            case &#39;JG&#39;:
                return new JiguangMessage();
            default:
                return null;
        }
    }
}

// 当前业务需要使用极光
$message = MessageFactory::createMessage(&#39;Ali&#39;);
echo $message->send(&#39;您有新的短消息,请查收&#39;);
登入後複製
#原始碼位址:簡單工廠實例-簡訊發送工廠

https://github.com/zhangyue0503/designpatterns-php/blob/master/01.simple-factory/source/simple-factory-message.php

說明#

  • createMessage一定要使用static?不一定,看自己業務狀況決定,需要常駐的全部static,按需實例化的就new完了再正常->去呼叫
  • 三個message子類別一定需要實作介面?也不一定,php本身就是弱型別語言,可以不去強制實現,但使用介面更符合物件導向的規範(請參考多態),簡單工廠本身其實是對多態的一種表述和應用
  • 當需要增加發送訊息的管道時,新增類別繼承Message接口,實作send()方法,修改MessageFactory()中createFactory()方法裡的switch
  • #思考上述修改違背了物件導向的什麼原則? (提示:開放XX)
  • 實例中沒有使用回傳值類型?本身這也是新語法,對於舊版本相容來說可以不需要去寫,但是如果公司技術棧已經升級到7以上的話,建議這種設計模式架構類的代碼還是按照上方解釋中的新特性寫法去書寫,也就是帶上參數類型和回傳值類型,比較的符合規範,也比較容易理解
  • 實例中傳錯了$type回傳NULL怎麼辦?親,實際寫程式碼的時候請處理好這個問題喲,返回一個預設的,或者上層捕獲都是不錯的解決方案,當然最好客戶端那邊提前判斷好,沒問題了再進工廠吧

推薦學習:《PHP影片教學

以上是淺談PHP中的簡單工廠模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:juejin.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板