乡下人产国偷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è)計模式之簡單工廠模式

      先從簡單工廠入門,不管是面試還是被他人面試,在問到設(shè)計模式的時候,大多數(shù)人都會提到工廠模式。毫無疑問,工廠相關(guān)的幾種模式在設(shè)計模式中是最出名的也是應(yīng)用比較廣泛的一種模式。在GoF設(shè)計模式中也都是屬于創(chuàng)建型的模式。

      但是,能夠說明白簡單工廠、工廠模式、抽象工廠模式這三種模式的人還真能讓面試官刮目相看。這里有個前提,是你真的能說明白,大部分人,包括在深入研究設(shè)計模式之前,我也沒辦法說清楚。不管是我去面試,還是面試其別人。當(dāng)我面試別人的時候,能講個大概也就差不多了。而我去面試的時候,也就是類似的講個大概。經(jīng)歷不少挫折之后才有了想深入的研究研究設(shè)計模式的想法,于是便會產(chǎn)生這一系列的文章。從這篇簡單工廠開始,我們一起再次深入的對設(shè)計模式進(jìn)行學(xué)習(xí)。

      當(dāng)然,這里用的是PHP。

      解釋

      簡單工廠,也稱靜態(tài)工廠,不屬于GoF23種設(shè)計模式。但是可以說是所有的設(shè)計模式中大家可能最容易理解,也可能在你的代碼中早就已經(jīng)用過不知道多少次的一種設(shè)計模式了。我們先從一個最最簡單的代碼段來看。

      // 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;
      }
      }

      沒錯,核心點(diǎn)就是中間那段簡單的switch代碼,我們在返回值類型中固定為Product接口的實現(xiàn)。

      在這段代碼中,使用了PHP新特性,參數(shù)類型返回值類型**

      產(chǎn)品接口和產(chǎn)品實現(xiàn)

      // 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();

      從以上代碼可以看出,其實這里就是一個工廠類根據(jù)我們傳入的字符串或者其他你自己定義的標(biāo)識符,來返回對應(yīng)的產(chǎn)品(Product對象)。

      形象化一點(diǎn)的比喻:我是一個賣手機(jī)的批發(fā)商(客戶Client,業(yè)務(wù)方),我需要一批手機(jī)(產(chǎn)品Product),于是我去讓富士康(工廠Factory)來幫我生產(chǎn)。我下了訂單($type變量)指明型號,然后富士康就給我對應(yīng)型號的手機(jī),然后我就繼續(xù)我的工作了,和富士康的合作還真是挺愉快的。

      這里比較規(guī)范的寫法可能是所有產(chǎn)品都會去實現(xiàn)一個統(tǒng)一的接口,然后客戶端只知道接口的方法統(tǒng)一調(diào)用即可。不規(guī)范的話也可以不使用接口,返回各種不同的對象,類似于外觀(Facade)模式進(jìn)行統(tǒng)一的門面管理。

      源碼地址:簡單工廠基礎(chǔ)類圖實現(xiàn)

      實例

      場景:短信發(fā)送功能模塊?,F(xiàn)在我們使用了三個商家的,分別是阿里云、蝶信、極光的短信服務(wù),在不同業(yè)務(wù)中可能使用不同的短信發(fā)送商,使用簡單工廠可以方便的完成這個需求。

      類圖

      代碼

      <?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;
      }
      }

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

      // 當(dāng)前業(yè)務(wù)需要使用極光
      $message = MessageFactory::createMessage('Ali');
      echo $message->send('您有新的短消息,請查收');

      源碼地址:簡單工廠實例-短信發(fā)送工廠

      說明

      • createMessage一定要使用static?不一定,看自己業(yè)務(wù)情況決定,需要常駐的全部static,按需實例化的就new完了再正常->去調(diào)用

      • 三個message子類一定需要實現(xiàn)接口?也不一定,php本身就是弱類型語言,可以不去強(qiáng)制實現(xiàn),但使用接口更加符合面向?qū)ο蟮囊?guī)范(請參考多態(tài)),簡單工廠本身其實是對多態(tài)的一種表述和應(yīng)用

      • 當(dāng)需要增加發(fā)送消息的渠道時,添加新類繼承Message接口,實現(xiàn)send()方法,修改MessageFactory()中createFactory()方法里的switch

      • 思考上述修改違背了面向?qū)ο蟮氖裁丛瓌t?(提示:開放XX)

      • 實例中沒有使用返回值類型?本身這也是新語法,對于老版本兼容來說可以不需要去寫,但是如果公司技術(shù)棧已經(jīng)升級到7以上的話,建議這種設(shè)計模式架構(gòu)類的代碼還是按照上方解釋中的新特性寫法去書寫,也就是帶上參數(shù)類型和返回值類型,更加的符合規(guī)范,也更容易理解

      • 實例中傳錯了$type返回NULL怎么辦?親,實際寫代碼的時候請?zhí)幚砗眠@個問題喲,返回一個默認(rèn)的,或者上層捕獲都是不錯的解決方案,當(dāng)然最好客戶端那邊提前判斷好,沒問題了再進(jìn)工廠吧

      下期看點(diǎn)

      工廠方法模式,接著發(fā)短信,但這回我們讓客戶端換個姿勢來發(fā)

      GitHub地址:https://github.com/zhangyue0503/designpatterns-php/blob/master/01.simple-factory/blog.md

      點(diǎn)擊【查看原文】進(jìn)入GitHub原文鏈接!

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多