欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > PHP設計模式之工廠模式(Factory)入門與應用詳解

PHP設計模式之工廠模式(Factory)入門與應用詳解

熱門標簽:昭通辦理400電話 青島語音外呼系統招商 山西探意電話機器人 騰訊外呼管理系統 岳陽外呼型呼叫中心系統在哪里 河南電銷卡外呼系統哪家強 百應電話機器人服務 揚州地圖標注app 山西回撥外呼系統

本文實例講述了PHP設計模式之工廠模式(Factory)。分享給大家供大家參考,具體如下:

工廠模式的意思其實就是提供獲取某個對象實例的一個接口,同時使調用代碼避免確定實例化基類的步驟,實際上就是建立一個統一的類實例化的函數接口,完事統一調用,統一控制,它是PHP中常用的一種設計模式,一般會配合單例模式一起使用,來加載php類庫中的類。來看一個簡單的應用場景:

  1. 我們擁有一個Json類,String類,Xml類。
  2. 如果我們不使用工廠方式實例化這些類,則需要每一個類都需要new一遍,過程不可控,類多了,到處都是new的身影
  3. 引進工廠模式,通過工廠統一創建對象實例。

代碼如下:

?php
//工廠模式 提供獲取某個對象實例的一個接口,同時使調用代碼避免確定實例化基類的步驟
//字符串類
class String {
 public function write() {}
}
//Json類
class Json {
 public function getJsonData() {}
}
//xml類
class Xml {
 public function buildXml() {}
}
//工廠類
class Factory {
 public static function create($class) {
 return new $class;
 }
}
Factory::create("Json"); //獲取Json對象

我們現在應該對于工廠模式有了一個大概的理解了,咱們接下來可以從字面上來理解一下。

工廠么,它就是生產產品的地方,它有原料,設備和產品,那么在PHP中,我們可以理解為,這個工廠模式可以通過一個工廠類(設備),來調用自身的靜態方法(生產方式)來產生對象實例(產品),在上述實例中的Json類等,就相當于原料了。

理解了上面的一段話之后,我們就可以再深入的了解下這個工廠模式了。

我們來考慮以下場景,如果項目中,我們通過一個類創建對象,在快完成或者已經完成,要擴展功能的時候,發現原來的類的類名不是很合適或者發現類需要添加構造函數參數才能實現功能擴展,在這種情況下,大家就可以感受到“高內聚低耦合”的博大精深,我們可以嘗試使用工廠模式解決這個問題。

還有就是最經典的數據庫連接問題等等,都可以使用工廠模式來接覺問題,咱們也不廢話,來看一下網上一個比較經典的案例:

interface Transport{
  public function go();
 
}
 
class Bus implements Transport{
  public function go(){
    echo "bus每一站都要停";
  }
}
 
class Car implements Transport{
  public function go(){
    echo "car跑的飛快";
  }
}
 
class Bike implements Transport{
  public function go(){
    echo "bike比較慢";
  }
}
 
class transFactory{
  public static function factory($transport)
  {
    
    switch ($transport) {
      case 'bus':
        return new Bus();
        break;
 
      case 'car':
        return new Car();
        break;
      case 'bike':
        return new Bike();
        break;
    }
  }
}
 
$transport=transFactory::factory('car');
$transport->go();

大家有了解過工廠模式應該都知道,工廠模式有三種,那就是一般工廠模式(靜態工廠模式),工廠模式,還有就是抽象工廠模式,咱這里并未把所有的案例全部介紹完畢,不過嘞,咱們可以跟著網上的一個案例,來簡單了解下工廠模式的三種變形的過程。

首先,我們來假設有個關于個人事務管理的項目,功能之一就是管理Appointment(預約)對象。我們的業務團隊和A公司建立了關系,目前需要使用一個叫做BloggsCal格式來和他們交流預約相關的數據,但是業務部門提醒可能會有更多的數據格式,所以解碼器可能會有多種,我們呢,為了避免在邏輯代碼中使用過多的if else,可能就會需要使用工廠模式來將創造者和使用者分開。

那么,我們就需要兩個類,一個類AppEncoder用于定義一個解碼器,將A公司傳來的數據解碼;另外一個類CommsManager用于獲取該解碼器,就是調用AppEncoder類,用于與A公司進行通信。使用模式術語說,CommsManager就是創造者,AppEncoder就是產品(一個創造者、一個產品,將類的實例化和對象的使用分離開,這就是工廠模式的思想)。

咱們先來通過簡單工廠模式實現上述任務場景,如下:

//產品類
class BloggsApptEncoder {
  function encode()
  {
    return "Appointment data encoded in BloggsCal format\n";
  } 
}
 
//創造者類
class CommsManager {
  function static getBloggsApptEncoder()
  { 
    return new BloggsApptEncoder();
  } 
}

大概明白了奧,好啦,現在又有新任務了,業務部門告訴我們需要新增一種數據格式MegCal,來完成數據交流,那么我們就需要新增對應的解碼器類,然后直接在commsManager新增參數來標識需要實例化哪個解碼器,如下:

class CommsManager {
  const BLOGGS = 1;
  const MEGA = 2;
  private $mode;
 
  public function __construct( $mode )
  {
    $this->mode = $mode;
  } 
 
  function getApptEncoder()
  {
    switch($this->mode) {
      case (self::MEGA):
        return new MegaApptEncoder();
      default:
        return new BloggsApptEncoder();
    }  
  }
}

上述兩個案例綜合起來就是簡單工廠模式了,它符合現實中的情況,而且客戶端免除了直接創建產品對象的責任,而僅僅負責“消費”產品(正如暴發戶所為)。

接下來,我們從開閉原則上來分析下簡單工廠模式,當新增一種數據格式的時候,只要符合抽象產品格式,那么只要通知工廠類知道就可以被使用了(即創建一個新的解碼器類,繼承抽象解碼器ApptEncoder),那么對于產品部分來說,它是符合開閉原則的——對擴展開放、對修改關閉,但是對于工廠類不太理想,因為每增加一各格式,都要在工廠類中增加相應的商業邏輯和判斷邏輯,這顯自然是違背開閉原則的。

然而在實際應用中,很可能產品是一個多層次的樹狀結構,這時候由于簡單工廠模式中只有一個工廠類來對應這些產品,所以這可能會把我們的上帝累壞了,因此簡單工廠模式只適用于業務簡單的情況下或者具體產品很少增加的情況,而對于復雜的業務環境可能不太適應了,這個時候就應該由工廠方法模式來出場了。

又來新需求了,那就是每種格式的預約數據中,需要提供頁眉和頁腳來描述每次預約。

咱們先來用簡單工廠模式來實現上述功能,如下:

// 簡單工廠模式
class CommsManager {
  const BLOGGS = 1;
  const MEGA = 2;
  private = $mode;
 
  public function __construct( $mode )
  {
    $this->mode = $mode;
  }
 
  // 生成解碼器對應的頁眉
  public function getHeaderText() 
  {
    switch( $this->mode ) {
      case ( self::MEGA ):
        return "MegaCal header\n";
      default:
        return "BloggsCal header\n";
    }
  }
  
  // 生成解碼器
  public function getApptEncoder()
  {
    switch( $this->mode ) {
      case ( self::MEGA ):
        return new MegaApptEncoder();
      default:
        return new BloggsApptEncoder();;
    }  
  }
}

從上述代碼中,我們可以看到,相同的條件語句switch在不同的方法中出現了重復,而且如果添加新的數據格式,那么需要改動的類過多。所以需要對我們的結構進行修改,以求更容易擴展和維護。

我們可以使用創造者子類分別生成對應的產品,這樣添加新的數據格式時,只需要添加一個創造者子類即可,方便擴展和維護,這也就是比簡單工廠模式更復雜一點的工廠模式,如下:

// 工廠模式
abstract class CommsManager {
  abstract function getHeaderText();
  abstract function getApptEncoder();
  abstract function getFooterText();
}
 
class BloggsCommsManager extends CommsManager {
  function getHeaderText()
  {
    return "BloggsCal Header\n"; 
  }
 
  function getApptEncoder()
  {
    return new BloggsApptEncoder();
  }
 
  function getFooterText()
  {
    return "BloggsCal Footer\n";
  }
}
 
class MegaCommsManager extends CommsManager {
  function getHeaderText()
  {
    return "MegaCal Header\n"; 
  }
 
  function getApptEncoder()
  {
    return new MegaApptEncoder();
  }
 
  function getFooterText()
  {
    return "MegaCal Footer\n";
  }
}

在這個時候,如果有新的數據格式,只需要添加一個創造類的子類即可,例如此時想獲取MegaCal對應的解碼器直接通過MegaCommsManager::getApptEncoder()獲取即可。

完了么?我只能說,這個實例還沒有完事。

新需求又來了,那就是不僅需要和A公司交流預約數據(Appointment),還需要交流待辦事宜(Ttd)、聯系人(Contact)等數據,同樣的這些數據交流的格式也是BloggsCal和MegaCal,這個時候,我們可以直接在對應解碼器的子類中添加處理事宜(TtD)和聯系人(Contact)的方法,如下:

// 抽象工廠模式
abstract class CommsManager {
  abstract function getHeaderText();
  abstract function getApptEncoder();
  abstract function getTtdEncoder();
  abstract function getContactEncoder();
  abstract function getFooterText();
}
 
class BloggsCommsManager extends CommsManager {
  function getHeaderText()
  {
    return "BloggsCal Header\n"; 
  }
 
  function getApptEncoder()
  {
    return new BloggsApptEncoder();
  }
 
  function getTtdEncoder()
  {
    return new BloggsTtdEncoder();
  }
 
  function getContactEncoder()
  {
    return new BloggsContactEncoder();
  }
 
  function getFooterText()
  {
    return "BloggsCal Footer\n";
  }
}
 
class MegaCommsManager extends CommsManager {
  function getHeaderText()
  {
    return "MegaCal Header\n"; 
  }
 
  function getApptEncoder()
  {
    return new MegaApptEncoder();
  }
 
  function getTtdEncoder()
  {
    return new MegaTtdEncoder();
  }
 
  function getContactEncoder()
  {
    return new MegaContactEncoder();
  }
 
  function getFooterText()
  {
    return "MegaCal Footer\n";
  }
}
 
//當然需要添加對應的TtdEncoder抽象類和ContactEncoder抽象類,以及他們的子類。

好啦,到這里就算是差不多結束了工廠模式的變形過程,我們可以來簡單歸納下這個變形過程中的核心,如下:

1.將系統和實現的細節分離開,我們可在示例中移除或者添加任意數目的編碼格式而不會影響系統。

2.對系統中功能相關的元素強制進行組合,因此,通過使用BloggsCommsManager,可以確定只使用與BloggsCal有關的類。

3.添加新產品時將會令人苦惱,因為不僅需要創建新產品的具體實現,而且為了支持它,我們必須修改抽象創建者和它的每個具體實現。

當然,我們可以創建一個標志參數來決定返回什么對象的單一的make()方法,而不用給每個工廠創建獨立的方法,如下:

abstract class CommsManager {
  const APPT = 1;
  const TTD = 2;
  const CONTACT = 3;
 
  abstract function getHeaderText();
  abstract function make ( $flag_init );
  abstract function getFooterText();
}
 
class BloggsCommsManager extends CommsManager {
  function getHeaderText()
  {
    return "BloggsCal Header\n";
  }
 
  function make( $flag_init )
  {
    switch ($flag_init) {
      case self::APPT:
        return new BloggsApptEncoder();
      case self::TTD:
        return new BloggsTtdEncoder();
      case self::CONTACT:
        return new BloggsContactEncoder();
    }
  }
 
  function getFooterText()
  {
    return "BloggsCal Header\n";
  }
}

此時,如果還需要添加交流其它的數據,此時只需在抽象創造者中添加一個新的flag_init標識,并在子創造者中的make方法中添加一個條件,相比來說比原先的更加容易擴展,只需修改少數地方即可。

最后,來簡單總結下:

簡單工廠:適用于生成數量少,功能簡單的產品(BloggApptEncoder和MegaApptEncoder)

工廠模式:適用于生成數量多,功能復雜的產品(多個產品樹[BloggCal,MegaCal]、單個產品族[apptEncoder]),相比簡單工廠來說:業務更復雜,功能更多,但是產品族還是單個。

抽象工廠:適用于生成多個產品族、多個產品樹的情景(產品族[appt,ttd,contact],產品樹[Bloggcal,megaCal])。相比于工廠模式,更容易擴展添加新的產品族

好啦,本次記錄就到這里了。

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • php設計模式 Factory(工廠模式)
  • 學習php設計模式 php實現工廠模式(factory)
  • PHP設計模式之工廠模式(Factory Pattern)的講解
  • PHP設計模式概論【概念、分類、原則等】
  • PHP設計模式之 策略模式Strategy詳解【對象行為型】
  • php設計模式 Template (模板模式)
  • PHP常用的三種設計模式匯總
  • php設計模式 DAO(數據訪問對象模式)
  • PHP經典面試題之設計模式(經常遇到)
  • PHP設計模式(一)工廠模式Factory實例詳解【創建型】

標簽:黃南 銅川 南陽 宜賓 婁底 湛江 寶雞 鎮江

巨人網絡通訊聲明:本文標題《PHP設計模式之工廠模式(Factory)入門與應用詳解》,本文關鍵詞  PHP,設計模式,之,工廠,模式,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP設計模式之工廠模式(Factory)入門與應用詳解》相關的同類信息!
  • 本頁收集關于PHP設計模式之工廠模式(Factory)入門與應用詳解的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    亚洲三级久久久| 欧美肉大捧一进一出免费视频| 在线观看国产精品一区| 欧美一级免费观看| 五月天亚洲精品| 色悠悠在线视频| 91精品国产综合久久婷婷香蕉| 亚洲小说欧美激情另类| 久久久久久久久久影视| 欧美日韩国产成人在线91| 亚洲尤物在线视频观看| 乳色吐息在线观看| 欧美日韩精品一区二区在线播放 | 久久久久亚洲AV成人无在| 精品欧美乱码久久久久久 | 免费人成又黄又爽又色| 2023国产精品视频| 国产一区二区三区最好精华液 | 美腿丝袜亚洲综合| 一级片视频免费看| 久久精品视频在线看| 国产成人综合自拍| 一本色道a无线码一区v| 一区二区三区视频在线看| 国产精品成人免费一区久久羞羞| 在线综合+亚洲+欧美中文字幕| 日韩精品国产精品| 精品人妻无码一区二区三区换脸| 久久天天做天天爱综合色| 国产成人在线网站| 在线观看日韩毛片| 午夜亚洲国产au精品一区二区| 黄色正能量网站| 欧美国产精品v| 91亚洲国产成人精品一区二三| 欧美日韩大陆一区二区| 麻豆精品视频在线观看视频| 成人信息集中地| 亚洲精品videosex极品| 无码精品一区二区三区在线播放| 久久精品夜夜夜夜久久| 波波电影院一区二区三区| 欧美伦理视频网站| 久久99久久精品| 黑鬼狂亚洲人videos| 亚洲中国最大av网站| 91网站免费入口| 成人欧美一区二区三区1314| 黄色激情在线观看| 国产亚洲短视频| 俄罗斯女人裸体性做爰| 欧美xxxxx裸体时装秀| 国产99久久久精品| 91精品国产乱码久久蜜臀| 国精品**一区二区三区在线蜜桃| 色哟哟亚洲精品| 美女网站色91| 色综合久久精品| 免费视频最近日韩| 色婷婷亚洲精品| 久久精品国产第一区二区三区| 好吊色视频在线观看| 免费成人小视频| 色88888久久久久久影院按摩| 人人精品人人爱| 中文在线字幕在线观看| 男女男精品网站| 在线视频亚洲一区| 国内精品免费在线观看| 欧美日韩国产综合视频在线观看| 国产精品一区二区久激情瑜伽| 在线播放视频一区| 成人午夜av电影| 日韩精品一区二区三区老鸭窝 | 成人午夜剧场视频网站| 亚洲免费视频成人| 五月婷六月丁香| 午夜精品影院在线观看| 日本高清一二三区| 欧美aaa在线| 欧美三级电影一区| 大桥未久av一区二区三区中文| 日韩亚洲欧美在线| 一起草最新网址| 欧美激情一区二区三区不卡 | 国产美女一区二区| 欧美一级在线观看| 91影视在线播放| 中文字幕精品在线不卡| 右手影院亚洲欧美| 亚洲r级在线视频| 色哟哟精品一区| 国产成人av电影在线| 2023国产精华国产精品| 免费看黄色aaaaaa 片| 一区二区不卡在线播放| 欧美老熟妇一区二区三区| 国产主播一区二区三区| 欧美电影免费观看高清完整版| 少妇献身老头系列| 亚洲激情在线激情| 色综合天天综合给合国产| 国产高清不卡一区二区| 久久精品欧美一区二区三区麻豆| 懂色av粉嫩av蜜乳av| 五月天亚洲婷婷| 欧美妇女性影城| 风韵丰满熟妇啪啪区老熟熟女| 亚洲三级理论片| 色域天天综合网| 成人性生交大合| 国产精品色在线| 日韩av毛片在线观看| 国产精品资源在线观看| 久久天堂av综合合色蜜桃网| 尤物视频最新网址| 蜜桃传媒麻豆第一区在线观看| 欧美一级黄色大片| 亚洲一区二区三区无码久久| 午夜精品成人在线视频| 欧美精品久久一区二区三区| www.欧美com| 亚洲国产精品视频| 欧美三级乱人伦电影| zjzjzjzjzj亚洲女人| 亚洲国产中文字幕在线视频综合| 欧美天堂一区二区三区| 动漫av在线免费观看| 亚洲va天堂va国产va久| 9191久久久久久久久久久| 一边摸一边做爽的视频17国产| 丝袜诱惑制服诱惑色一区在线观看| 欧美日韩国产不卡| 黑丝av在线播放| 久久99在线观看| 国产女人18毛片水真多成人如厕| 欧美a级片免费看| gogo大胆日本视频一区| 亚洲在线视频免费观看| 欧美一区二区三区视频在线 | 亚洲成人资源在线| 欧美一区中文字幕| 国产精成人品免费观看| 国产剧情一区二区| 亚洲欧美综合色| 欧美日韩中文另类| 午夜av免费看| 美女国产一区二区| 国产亚洲成av人在线观看导航| 欧美黑人性猛交xxx| 日本亚洲一区二区三区| 日韩精品亚洲专区| 国产日韩综合av| 欧美在线一区二区三区| 亚洲av永久无码精品| 久久99日本精品| 最新国产精品久久精品| 欧美美女黄视频| 国产传媒国产传媒| eeuss国产一区二区三区| 亚洲高清视频在线| www成人在线观看| 色欲综合视频天天天| aaaa黄色片| 国产精品亚洲专一区二区三区| 亚洲同性同志一二三专区| 欧美亚洲丝袜传媒另类| 国产艳俗歌舞表演hd| 丁香婷婷综合激情五月色| 亚洲国产成人porn| 久久美女高清视频| 欧美亚洲国产一区二区三区va | 国产精品探花一区二区在线观看| 国产剧情一区在线| 亚洲愉拍自拍另类高清精品| 26uuu精品一区二区在线观看| 日本韩国欧美国产| 日本xxxxxxxxx18| 97se亚洲国产综合自在线不卡 | 91精品国产欧美一区二区18| 91无套直看片红桃在线观看| 先锋资源在线视频| 精品在线观看视频| 亚洲精品国产无套在线观| 精品国产乱码久久久久久老虎 | 91精品国产高清一区二区三蜜臀| 特级西西人体wwwww| av在线不卡观看免费观看| 青椒成人免费视频| 亚洲天天做日日做天天谢日日欢| 欧美第一区第二区| 在线精品视频免费观看| 欧美精品日韩在线| 国产精品熟妇一区二区三区四区| 国产精品白丝jk黑袜喷水| 日韩国产欧美视频| 亚洲麻豆国产自偷在线| 国产欧美一区二区三区网站| 欧美一级日韩不卡播放免费| 色悠久久久久综合欧美99|