承接上篇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模式設計之 注冊樹模式