1. 程式人生 > 其它 >PHP設計模式之工廠方法模式

PHP設計模式之工廠方法模式

PHP設計模式之工廠方法模式

目錄

工廠方法模式對比簡單工廠來說,最核心的一點,其實就是將實現推遲到子類。怎麼理解呢?我們可以將上回的簡單工廠當做父類,然後有一堆子類去繼承它。createProduct()這個方法在父類中也變成一個抽象方法。然後所有的子類去實現這個方法,不再需要用switch去判斷,子類直接返回一個例項化的物件即可。

例項

場景:光說不練假把式,把上回的簡訊傳送改造改造,我們依然還是使用上回的那幾個簡訊傳送商。畢竟大家已經很熟悉了嘛,不過以後要更換也說不定,商場如戰場,大家還是利益為先。這樣的話,我們通過工廠方法模式來進行解耦,就可以方便的新增修改簡訊提供商咯。

簡訊傳送類圖

程式碼實現

<?php

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

class AliYunMessage implements Message{
    public function send(string $msg){
        // 呼叫介面,傳送簡訊
        // xxxxx
        return '阿里雲簡訊(原阿里大魚)傳送成功!簡訊內容:' . $msg;
    }
}

class BaiduYunMessage implements Message{
    public function send(string $msg){
        // 呼叫介面,傳送簡訊
        // xxxxx
        return '百度SMS簡訊傳送成功!簡訊內容:' . $msg;
    }
}

class JiguangMessage implements Message{
    public function send(string $msg){
        // 呼叫介面,傳送簡訊
        // xxxxx
        return '極光簡訊傳送成功!簡訊內容:' . $msg;
    }
}


abstract class MessageFactory{
    abstract protected function factoryMethod();
    public function getMessage(){
        return $this->factoryMethod();
    }
}

class AliYunFactory extends MessageFactory{
    protected function factoryMethod(){
        return new AliYunMessage();
    }
}

class BaiduYunFactory extends MessageFactory{
    protected function factoryMethod(){
        return new BaiduYunMessage();
    }
}

class JiguangFactory extends MessageFactory{
    protected function factoryMethod(){
        return new JiguangMessage();
    }
}

// 當前業務需要使用百度雲
$factory = new BaiduYunFactory();
$message = $factory->getMessage();
echo $message->send('您有新的短訊息,請查收');

說明

  • 和類圖完全一致,基本不需要什麼說明了吧,注意工廠方法模式的特點,實現推遲到了子類!!
  • 業務呼叫的時候需要耦合一個Factory子類。確實是這樣,如果你想一個統一的出口來呼叫,請在外面加一層簡單工廠就好啦,這就當成一道思考題吧
  • 不拘泥於目前的形式,可以不用抽象類,直接用一個介面來定義工廠方法,摒棄掉getMessage()方法,外部直接呼叫公開的模板方法(factoryMethod)即可

連結:https://juejin.cn/post/6844903873669234702