PHP設計模式(二),php設計模式
從最近開始我給自己定了個目標,每盩厔少更新2篇部落格,用來記錄自己在上一周裡面遇到的問題或者想出的新點子,一方面對自己掌握的知識進行記錄,免得時間久了忘得一乾二淨,二來我的博文雖然不怎麼好但也許會對一小部分讀者產生一定的影響,而且我相信隨著我原創博文寫的次數越來越多,肯定水平會越來越高,深度也會越來越深(哈哈,我也很羨慕那些出名的博主,不但專業知識很棒,而且文筆也棒的很)。一周兩篇我發現完全記錄不完我想記錄的東西,就像這周,我還有日誌系統、位元據緩衝(其實叫low一點的資料庫比較合適)、QQwry.dat資料解讀、zip壓縮檔增量產生這幾個方面的都沒有進寫,在以後的時間裡我會慢慢更新到我的部落格的,好了不扯了,這次我來介紹另外一種模式。
其實這種模式也是比較常用的,應該首先介紹,但由於我接觸的單例模式比較多,所以就先介紹單例模式了。簡單原廠模式,首先看下對它的定義:從設計模式的類型上來說,簡單原廠模式是屬於建立型模式,又叫做靜態Factory 方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單原廠模式是由一個工廠對象決定建立出哪一種產品類的執行個體。簡單原廠模式是原廠模式家族中最簡單實用的模式,可以理解為是不同原廠模式的一個特殊實現。
簡單原廠模式在項目中有什麼好處呢?他有兩個好處:
1. 首先就是使用簡單原廠模式可以根據不同的參數去執行個體化不同的類,而不是new方法去執行個體化每一個不同的類,這樣給使用者這樣更好管理。
2. 其次就是如果要執行個體化的類在多個檔案中用到,當我們修改類名稱的時候只需要去修改工廠類就行,而不必修改每一個執行個體化該類的檔案(有點雞肋的感覺,這種情況很少見)。
看一個最經典也最好理解的一個簡單原廠模式的例子,運算子操作:
簡單原廠模式的工廠類一般是使用靜態方法,通過接受不同的參數來返回不同的對象執行個體,代碼是寫死的,因此不修改代碼就不能進行擴充,違反了OCP(對擴充開發,對修改關閉原則)。
php/** * 簡單原廠模式——經典運算子例子 * @author 燕睿濤(luluyrt@163.com) *//*簡單工********************廠********************類*/class Operation{ /** * @var int $numa * 要操作的兩個數字 */ protected $numa; protected $numb; public function __construct($a,$b){ $this->numa = $a; $this->numb = $b; } //靜態方法,通過接受不同的參數產生不同的對象執行個體 public static function create($operation,$a,$b){ switch ($operation) { case '+': return new Operationadd($a,$b); break; case '-': return new Operationminus($a,$b); break; default: # code... break; } }}/************************************************//*加法*/class Operationadd extends Operation{ public function doing(){ return $this->numa + $this->numb; }}/*減法*/class Operationminus extends Operation{ public function doing(){ return $this->numa - $this->numb; }}$test = Operation::create('+',2,56);echo $test->doing();
之前我在項目中只接觸到了簡單原廠模式,為了寫這篇文章我特意查了資料,發現原廠模式有三種:簡單原廠模式(又叫靜態原廠模式)、原廠模式、抽象原廠模式,看了原廠模式之後感覺他的用處好像不是很大,只是符合了OCP原則,在有新的符合抽象產品介面和抽象工廠介面的產品時我們只需要去擴充一種具體的產品和工廠就行,而不必去修改原有代碼,總結下原廠模式的優缺點:
優點:首先就是符合了OCP原則,擴充性提高了;其次就是可維護性提高了,在修改一個具體工廠角色時只要找到自己的工廠角色就行,不用擔心影響到其他工廠角色的實現。
缺點:代碼多了,每種產品都要一個產品類和一個工廠類。這個缺點可以用簡單原廠模式和原廠模式的結合來實現,將類似的產品類的工廠類合并為一個。
php/** * 簡單原廠模式——經典運算子例子 * @author 燕睿濤(luluyrt@163.com) *//*工*********廠**********方**********法*///交通工具介面(抽象產品角色)interface vehicle{ public function runing();}//交通工具工廠介面(抽象工廠角色)interface vehiclefactory{ public static function get();}/*具體產品角色*/class car implements vehicle{ public function runing(){ echo "My speed is 120KM/h \r"; }}class bicycle implements vehicle{ public function runing(){ echo "My speed is 30KM/h \r"; }}/*具體工廠角色*/class carfactory implements vehiclefactory{ public static function get(){ return new car(); }}class bicyclefactory implements vehiclefactory{ public static function get(){ return new bicycle(); }}$test = bicyclefactory::get();$test->runing();
工廠類自己沒在具體項目中用過,說起來總感覺有點怪怪的感覺,要是有什麼不對的、不恰當的地方,還望各位高手前輩們指出。
send Me~
http://www.bkjia.com/PHPjc/920433.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/920433.htmlTechArticlePHP設計模式(二),php設計模式 從最近開始我給自己定了個目標,每盩厔少更新2篇部落格,用來記錄自己在上一周裡面遇到的問題或者想出的新...