承接上篇php模式設計之 單例模式,(雖然好像關係不大)。今天講述第二種基礎的模式設計——工廠模式。php
那麼何爲工廠模式?html
從名字來看,彷佛看不出什麼端倪。工廠模式,和生產有關?仍是和生產流程有關?難道還和工廠領導有關?和領導祕書有關?祕書... 好了不賣關子了,所謂工廠模式還真和生產有關。生產什麼呢?生產出來的是一個實例對象。經過什麼設備生產?經過一個工廠類生產。怎麼生產呢?工廠類調用自身靜態方法來生產對象實例。mysql
工廠模式有一個關鍵的構造,根據通常原則命名爲Factory的靜態方法,然而這只是一種原則,雖然工廠方法能夠任意命名這個靜態還能夠接受任意數據的參數,必須返回一個對象。sql
爲何要用工廠模式?數據庫
不少沒接觸過工廠模式的人會不由問,爲啥我要費那麼大的勁兒去構造工廠類去建立對象呢?不去套用那些易維護,可擴展之類的話,咱們能夠考慮這樣一個簡單的問題。若是項目中,咱們經過一個類建立對象。在快完成或者已經完成,要擴展功能的時候,發現原來的類類名不是很合適或者發現類須要添加構造函數參數才能實現功能擴展。我靠!我都經過這個類建立了一大堆對象實例了啊,難道我還要一個一個去改不成?咱們如今才感覺到了「高內聚低耦合」的博大精深。沒問題,工廠方法能夠解決這個問題。cookie
再考慮一下,我要鏈接數據庫,在php裏面就有好幾種方法,mysql擴展,mysqli擴展,PDO擴展。我就是想要一個對象用來之後的操做,具體要哪一個,視狀況而定嘍。既然大家都是鏈接數據庫的操做,大家就應該擁有相同的功能,創建鏈接,查詢,斷開鏈接...(此處顯示接口的重要性)。總而言之,這幾種方法應該「團結一致,一致對外」。如何實現呢?利用工廠模式。session
工廠模式如何實現?函數
相對於單例模式,上面咱們提供了足夠的信息,工廠類,工廠類裏面的靜態方法。靜態方法裏面new一下須要建立的對象實例就搞定了。固然至於考慮上面的第二個問題,根據工廠類靜態方法的參數,咱們簡單作個判斷就行了。管你用if..else..仍是switch..case..,能快速高效完成判斷該建立哪一個類的工做就行了。最後,必定要記得,工廠類靜態方法返回一個對象。不是兩個,更不是三個。post
基本的工廠類:學習
//要建立對象實例的類 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就是***啊」。
筆者不敢認可本身會模式設計,我也是個不足一年的初學者,分享博客只是想記錄本身的學習歷程,能獲得知道更是夢寐以求。若是能給別人帶來幫助,那就更好啦~~~
系列文章: