從最近開始我給自己定了個目標,每周至少更新2篇博客,用來記錄自己在上一周裡面遇到的問題或者想出的新點子,一方面對自己掌握的知識進行記錄,免得時間久了忘得一干二淨,二來我的博文雖然不怎麼好但也許會對一小部分讀者產生一定的影響,而且我相信隨著我原創博文寫的次數越來越多,肯定水平會越來越高,深度也會越來越深(哈哈,我也很羨慕那些出名的博主,不但專業知識很棒,而且文筆也棒的很)。一周兩篇我發現完全記錄不完我想記錄的東西,就像這周,我還有日志系統、二進制數據緩存(其實叫low一點的數據庫比較合適)、QQwry.dat數據解讀、zip壓縮文件增量生成這幾個方面的都沒有進寫,在以後的時間裡我會慢慢更新到我的博客的,好了不扯了,這次我來介紹另外一種模式。
其實這種模式也是比較常用的,應該首先介紹,但由於我接觸的單例模式比較多,所以就先介紹單例模式了。簡單工廠模式,首先看下對它的定義:從設計模式的類型上來說,簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。
簡單工廠模式在項目中有什麼好處呢?他有兩個好處:
1. 首先就是使用簡單工廠模式可以根據不同的參數去實例化不同的類,而不是new方法去實例化每一個不同的類,這樣給使用者這樣更好管理。
2. 其次就是如果要實例化的類在多個文件中用到,當我們修改類名稱的時候只需要去修改工廠類就行,而不必修改每一個實例化該類的文件(有點雞肋的感覺,這種情況很少見)。
看一個最經典也最好理解的一個簡單工廠模式的例子,運算符操作:
簡單工廠模式的工廠類一般是使用靜態方法,通過接受不同的參數來返回不同的對象實例,代碼是寫死的,因此不修改代碼就不能進行擴展,違反了OCP(對擴展開發,對修改關閉原則)。
<?php /** * 簡單工廠模式——經典運算符例子 * @author 燕睿濤([email protected]) */ /*簡單工********************廠********************類*/ 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 燕睿濤([email protected]) */ /*工*********廠**********方**********法*/ //交通工具接口(抽象產品角色) 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~