相信很多的朋友看到標題的時候都是同樣的疑問,在我們開發中php中很多種模式,今天我們就給大家介紹其中的一個php工廠模式,那麼我們首先要明白什麼是php工廠模式,為什麼要用php工廠模式?
那麼何為工廠模式?
從名字來看,似乎看不出什麼端倪。工廠模式,和生產有關?還是跟生產流程有關?難道還和工廠領導有關?和領導秘書有關?秘書... 好了不賣關子了,所謂工廠模式還真和生產有關。生產什麼呢?生產出來的是一個實例物件。透過什麼設備生產?透過一個工廠類別生產。怎麼生產呢? 工廠類別呼叫自身靜態方法來生產物件實例。
工廠模式有一個關鍵的構造,根據一般原則命名為Factory的靜態方法,然而這只是一種原則,雖然工廠方法可以任意命名這個靜態還可以接受任意資料的參數,必須傳回一個物件。
為什麼要用工廠模式?
很多沒接觸過工廠模式的人會不禁問,為啥我要費那麼大的勁兒去構造工廠類去創建對象呢?不去套用那些容易維護,可擴充之類的話,我們可以考慮這樣一個簡單的問題。如果在專案中,我們透過一個類別建立物件。在快完成或已經完成,要擴展功能的時候,發現原來的類別類別名稱不是很合適或發現類別需要添加構造函數參數才能實現功能擴展。我靠!我都透過這個類別創建了一大堆物件實例了啊,難道我還要一個一個去改不成?我們現在才感受到了「高內聚低耦合」的博大精深。沒問題,工廠方法可以解決這個問題。
再考慮一下,我要連接資料庫,在php裡面就有好幾種方法,mysql擴展,mysqli擴展,PDO擴展。我就是想要一個物件用來以後的操作,具體要哪一個,視情況而定嘍。既然你們都是連接資料庫的操作,你們就應該擁有相同的功能,建立連接,查詢,斷開連接...(此處顯示介面的重要性)。總而言之,這幾種方法應該「團結一致,一致對外」。如何實現呢?利用工廠模式。
工廠模式如何實現?
相對於單例模式,上面我們提供了足夠的信息,工廠類,工廠類裡面的靜態方法。靜態方法裡面new一下需要建立的物件實例就搞定了。當然至於考慮上面的第二個問題,根據工廠類別靜態方法的參數,我們簡單做個判斷就好了。管你用if..else..還是switch..case..,能快速高效完成判斷該創建哪個類別的工作就好了。最後,一定要記得,工廠類別靜態方法傳回一個物件。不是兩個,更不是三個。
基本的工廠類別:
//要创建对象实例的类class MyObject{ } //工厂类class MyFactory{public static function factory(){return new MyObject(): } } $instance=MyFactory::factory();
一個稍微複雜的工廠模式:
<?php 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();
需要工廠靜態方法為factory()的時候,千萬別再傻乎乎的把工廠類別命名為Factory了。為啥啊?別忘了同名建構子的事兒啊~
最後還是談點感受吧,很多新手比較眼高手低,剛剛會了if..else..,session,cookie就要來點高大上的了。與人交談動輒可擴展性,可維護性之類雲雲,至於實例的話,就會一時語塞。有時候覺得,無論自己寫程式碼還是跟別人學習,都處於“眾裡尋他千百度”的時候,真正踏實學習後,驀然回首,“那人卻在燈火闌珊處”,大呼:“原來這TM就是***啊」。
總結:
看完這篇文章相信大家對php工廠模式有了一個大概的了解了,希望對你的工作有所幫助!
相關推薦:
##以上是什麼是php工廠模式?為何要用php工廠模式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!