简单工厂模式:提供获取某个类的新实例的一个接口,同时使调用代码避免确定实际实例化基类的步骤
请看下面代码
<?php
class mysql_DB{ }
class sqlite_DB{ }
class pdo_DB{ }
class Factory{
public static function getDB($type){
if(strtolower($type)=='mysql'){
return new mysql_DB();
} else if(strtolower("sqlite")=="sqlite") {
return new sqlite_DB();
} else {
return new pdo_DB();
}
//或者用下面的代码实现:
// $type=strtolower($type)."_DB";
// return new $type();
}
}
$a=Factory::getDB("sqlite");
var_dump($a);//object(sqlite_DB)#1 (0) { }
$b=Factory::getDB("mysql");
var_dump($b);//object(mysql_DB)#2 (0) { }
?>
如果不将Factory中的代码封装一下的话,那么在每次要实例化对象时,都得有那么多行的if..else if ...或者switch/case来判断到底要实例化哪个对象;
如果有一百个页面都要实例化这类对象,如果不封装,那这么多的判断条件就得写100次,一方面,这么多代码写着也挺浪费时间的(有时候if/else if或者switch/case多达几十个),就算你复制粘贴一百次也是一样;另一方面,一旦要修改这些判断中的某条语句,那么100个页面就得挨个修改,哪怕之后只增加一个两三行的判断。
所以可以这些判断进行封装,封装在一个工厂类的静态方法中,这个通过调用这个工厂中的静态方法(也就是工厂类提供给外界一个接口),然后获得一个新实例的对象,不用每次都写一次判断,减少了很多步骤,这就减少了很多错误的发生,还便于修改。在其他页面中,直接用include包含这个文件即可。
简单工厂有一定的局限,可以看另一篇博文:工厂模式