时间:2021-07-01 10:21:17 帮助过:11人阅读
//生产汽车的标准
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.gxlcms.com)!