工廠模式通俗來說是指,為一些有著相同結構的類別創建一個類族,並且為這個族群提供唯一一個入口類。請注意「相同結構」這個描述,它指的是某類物體擁有一些能讓我們區別與其他物體的特徵,比如說現在有一道聯想題,透過兩個字聯想一樣東西。 「四個輪子,燒汽油」。我想你一定能立刻聯想到小轎車、廂型車、的士之類的車,不會聯想到摩托車。這裡的「四個輪子」和「燒汽油」便是小轎車、麵包車、的士的相同特徵,我們以它們來將小轎車、麵包車和的士歸類為「汽車」這個族群。
回到php當中,這裡將以實例來說明工廠模式。
現在有一個汽車工廠,它生產小汽車和巴士車,小汽車和巴士車都是由引擎、車身和輪子組成的。
分析:
1、生產各種汽車有共同的標準,都必須生產引擎、車身和輪子,於是我們可以為生產汽車制定一個接口類,各類汽車都必須遵循這個接口類中的標準。
2、外界需要提供工廠生產小型汽車和巴士車的入口。
//生产汽车的标准 interface carNorms{ function engine();//引擎 function body();//车身 function whell();//轮子 } //生产小汽车 class car implements carNorms{ public function engine(){ return '汽车引擎'; } public function body(){ return '汽车车身'; } public function whell(){ return '汽车轮子'; } } //生产巴士车 class bus implements carNorms{ public function engine(){ return '巴士引擎'; } public function body(){ return '巴士车身'; } public function whell(){ return '巴士轮子'; } } //汽车工厂 class carFactory{ static public function carInstance($type){ $instance=''; switch($type){ case 'car': $instance=new car(); break; case 'bus': $instance=new bus(); break; default: throw new Exception('本工厂无法生产这种类型的车'); } if(!$instance instanceof carNorms){ throw new Exception('这种车不符合生产标准'); } return $instance; } } $createCar=carFactory::carInstance('car'); $car['engine']=$createCar->engine(); $car['body']=$createCar->body(); $car['whell']=$createCar->whell(); print_r($car);
這是一個標準的工廠類,現在新的需求來了,工廠還需要生產卡車。
分析:由於生產卡車也符合該工廠的生產標準,我們可以直接加入卡車類,並在工廠類中增加相應的入口。
class truck implements carNorms{ public function engine(){ return '卡车引擎'; } public function body(){ return '卡车车身'; } public function whell(){ return '卡车轮子'; } }
//汽车工厂 class carFactory{ static public function carInstance($type){ $instance=''; switch($type){ case 'car': $instance=new car(); break; case 'bus': $instance=new bus(); break; case 'truck': $instance=new truck(); break; default: throw new Exception('本工厂无法生产这种类型的车'); } if(!$instance instanceof carNorms){ throw new Exception('这种车不符合生产标准'); } return $instance; } }
很輕鬆的完成了,但是我們在這假設一下,如果生產標準變了,生產環節還需要加入品質檢測,我們要完成這個更改,必須在介面中加入品質測試方法。
//生产汽车的标准 interface carNorms{ function engine();//引擎 function body();//车身 function whell();//轮子 function check();//质量测试 }
麻煩的是,工廠生產的所有汽車都必須加入品質檢測方法,在該工廠中,只生產三種汽車,似乎不是很麻煩。但我們再想一想,若是一個工廠有成千上萬種產品,增加一個標準將要給每一種產品都添加進這種標準,將產生多大的成本開銷!這就是工廠方法的不足之處,使用工廠模式一定要注意!
以上就是php物件導向開發之-工廠模式的內容,更多相關內容請關注PHP中文網(www.php.cn)!