抽象工廠模式是對工廠模式的抽象,通俗來說,就是把工廠模式的結構分離出來成為能獨立運作的個體。
還是拿工廠模式中的例子來說明:
現在有一個汽車工廠,它生產小汽車和巴士車,小汽車和巴士車都是由引擎、車身和輪子組成的。
在工廠模式中,我們把小汽車和巴士車作為汽車族群中的兩個類別,生產引擎、車身和輪子為生產汽車的固定結構,如下圖所示:
在抽象工廠模式中,把生產引擎、車身和輪子分別抽像出來,如下圖所示:
實際部署為:
//生产引擎的标准 interface engineNorms{ function engine(); } class carEngine implements engineNorms{ public function engine(){ return '汽车引擎'; } } class busEngine implements engineNorms{ public function engine(){ return '巴士车引擎'; } } //生产车身的标准 interface bodyNorms{ function body(); } class carBody implements bodyNorms{ public function body(){ return '汽车车身'; } } class busBody implements bodyNorms{ public function body(){ return '巴士车车身'; } } //生产车轮的标准 interface whellNorms{ function whell(); } class carWhell implements whellNorms{ public function whell(){ return '汽车轮子'; } } class busWhell implements whellNorms{ public function whell(){ return '巴士车轮子'; } }
再繼續對工廠進行抽象,抽象汽車工廠和巴士車工廠,並且讓各工廠與各組件相關聯,如圖:
實際部署為:
實際部署為:
//生产引擎的标准 interface engineNorms{ function engine(); } class carEngine implements engineNorms{ public function engine(){ return '汽车引擎'; } } class busEngine implements engineNorms{ public function engine(){ return '巴士车引擎'; } } //生产车身的标准 interface bodyNorms{ function body(); } class carBody implements bodyNorms{ public function body(){ return '汽车车身'; } } class busBody implements bodyNorms{ public function body(){ return '巴士车车身'; } } //生产车轮的标准 interface whellNorms{ function whell(); } class carWhell implements whellNorms{ public function whell(){ return '汽车轮子'; } } class busWhell implements whellNorms{ public function whell(){ return '巴士车轮子'; } }
//工厂标准
interface factory {
static public function getInstance($type);
}
//汽车工厂
class carFactory implements factory{
static public function getInstance($type){
$instance='';
switch($type){
case 'engine':
$instance=new carEngine();
break;
case 'body':
$instance=new carBody();
break;
case 'whell':
$instance=new carWhell();
break;
default:
throw new Exception('汽车工厂无法生产这种产品');
}
return $instance;
}
}
//巴士车工厂
class busFactory implements factory{
static public function getInstance($type){
$instance='';
switch($type){
case 'engine':
$instance=new busEngine();
break;
case 'body':
$instance=new busBody();
break;
case 'whell':
$instance=new busWhell();
break;
default:
throw new Exception('巴士车工厂无法生产这种产品');
}
return $instance;
}
}
$car['engine']=carFactory::getInstance('engine')->engine();
$car['body']=carFactory::getInstance('body')->body();
$car['whell']=carFactory::getInstance('whell')->whell();
print_r($car);
$bus['engine']=busFactory::getInstance('engine')->engine();
$bus['body']=busFactory::getInstance('body')->body();
$bus['whell']=busFactory::getInstance('whell')->whell();
print_r($bus);
抽象工廠模式將工廠模式進行抽象,可以使得抽像出來的新結構更加的靈活。例如,若生產車身需要一個噴漆的動作,在工廠模式中,我們需要對整體結構進行更改,而抽象工廠中,只需要對生產車身進行更改就ok了。
抽象工廠模式同樣具有工廠模式對結構要求高的缺點,整體結構的擴展或精簡將變得更加的煩雜,所以使用抽象工廠模式時,對等級結構的劃分是非常重要的。
以上就是php物件導向開發之-抽象工廠模式的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)!
相關文章:
🎜