PHP設計模式之工廠方法模式
阿新 • • 發佈:2021-06-17
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)即可