乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      PHP設(shè)計模式之工廠方法模式

       硬核項目經(jīng)理 2021-05-31

      PHP設(shè)計模式之工廠方法模式

      上回說到,簡單工廠不屬于GoF的二十三種設(shè)計模式,這回可就來真家伙了,大名頂頂?shù)?span style="box-sizing: border-box;font-weight: 600;">工廠方法模式前來報道!

      GoF類圖解釋

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

      GoF定義:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。Factory Method使一個類的實例化推遲到其子類。

      GoF類圖

      • 類圖中的Product為產(chǎn)品

      • 類圖中的Creator為創(chuàng)建者

      • 創(chuàng)建者父類有一個抽象的FactoryMethod()工廠方法

      • 所有創(chuàng)建者子類需要實現(xiàn)這個工廠方法,返回對應(yīng)的具體產(chǎn)品

      • 創(chuàng)建者父類可以有一個AnOperation()操作方法,直接返回product,可以使用FactoryMethod()去返回,這樣外部只需要統(tǒng)一調(diào)用AnOperation()

      代碼實現(xiàn)

      首先是商品相關(guān)的接口和實現(xiàn)類,和簡單工廠的類似:

      // 商品接口
      interface Product{
      function show() : void;
      }

      // 商品實現(xiàn)類A
      class ConcreteProductA implements Product{
      public function show() : void{
      echo "I'm A.\n";
      }
      }

      接下來是創(chuàng)建者的抽象和實現(xiàn)類:

      // 創(chuàng)建者抽象類
      abstract class Creator{

      // 抽象工廠方法
      abstract protected function FactoryMethod() : Product;

      // 操作方法
      public function AnOperation() : Product{
      return $this->FactoryMethod();
      }
      }

      // 創(chuàng)建者實現(xiàn)類A
      class ConcreteCreatorA extends Creator{
      // 實現(xiàn)操作方法
      protected function FactoryMethod() : Product{
      return new ConcreteProductA();
      }
      }

      這里和簡單工廠就有了本質(zhì)的區(qū)別,我們?nèi)サ袅藧盒牡膕witch,讓每個具體的實現(xiàn)類來進(jìn)行商品對象的創(chuàng)建。沒錯,單一和封閉,每個單獨的創(chuàng)建者子類只在工廠方法中和一個商品有耦合,有沒有其他商品和其他的工廠來跟客戶合作過這個子類完全不知道。

      同樣還是拿手機(jī)來比喻:我是一個賣手機(jī)的批發(fā)商(客戶Client,業(yè)務(wù)方),我需要一批手機(jī)(產(chǎn)品ProductA),于是我去讓富X康(工廠Creator)來幫我生產(chǎn)。我跟富士康說明了需求,富士康說好的,讓我的衡陽工廠(ConcreteCreatorA)來搞定,不需要總廠上,你這小單子,灑灑水啦。然后過了一陣我又需要另一種型號的手機(jī)(產(chǎn)品ProductB),富士康看了看后又讓鄭州富士康(ConcreteCreatorB)來幫我生產(chǎn)。反正不管怎么樣,他們總是給了我對應(yīng)的手機(jī)。而且鄭州工廠并不知道衡陽工廠生產(chǎn)過什么或者有沒有跟我合作過,這一切只有我和總工廠知道。

      完整代碼:工廠方法模式

      實例

      場景:光說不練假把式,把上回的短信發(fā)送改造改造,我們依然還是使用上回的那幾個短信發(fā)送商。畢竟大家已經(jīng)很熟悉了嘛,不過以后要更換也說不定,商場如戰(zhàn)場,大家還是利益為先。這樣的話,我們通過工廠方法模式來進(jìn)行解耦,就可以方便的添加修改短信提供商咯。

      短信發(fā)送類圖

      代碼實現(xiàn)


      <?php

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

      class AliYunMessage implements Message{
      public function send(string $msg){
      // 調(diào)用接口,發(fā)送短信
      // xxxxx
      return '阿里云短信(原阿里大魚)發(fā)送成功!短信內(nèi)容:' . $msg;
      }
      }

      class BaiduYunMessage implements Message{
      public function send(string $msg){
      // 調(diào)用接口,發(fā)送短信
      // xxxxx
      return '百度SMS短信發(fā)送成功!短信內(nèi)容:' . $msg;
      }
      }

      class JiguangMessage implements Message{
      public function send(string $msg){
      // 調(diào)用接口,發(fā)送短信
      // xxxxx
      return '極光短信發(fā)送成功!短信內(nèi)容:' . $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();
      }
      }

      // 當(dāng)前業(yè)務(wù)需要使用百度云
      $factory = new BaiduYunFactory();
      $message = $factory->getMessage();
      echo $message->send('您有新的短消息,請查收');

      完整源碼:短信發(fā)送工廠方法

      說明

      • 和類圖完全一致,基本不需要什么說明了吧,注意工廠方法模式的特點,實現(xiàn)推遲到了子類??!

      • 業(yè)務(wù)調(diào)用的時候需要耦合一個Factory子類。確實是這樣,如果你想一個統(tǒng)一的出口來調(diào)用,請在外面加一層簡單工廠就好啦,這就當(dāng)成一道思考題吧

      • 不拘泥于目前的形式,可以不用抽象類,直接用一個接口來定義工廠方法,摒棄掉getMessage()方法,外部直接調(diào)用公開的模板方法(factoryMethod)即可

      下期看點

      抽象工廠模式,老大哥即將登場。壓軸的總是最強(qiáng)悍的,讓我們看看老大哥的本事!

      github鏈接:https://github.com/zhangyue0503/designpatterns-php/blob/master/02.factory/blog.md

      點擊原文鏈接可跳轉(zhuǎn)至github查看

        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多