工厂类是指包含一个专门用来创建其他对象的方法的类,工厂类在多态性编程实践中是至关重要的,它允许动态的替换类,修改配置,通常会使应用程序更加灵活,熟练掌握工厂模式高级php开发人员是很重要的。
基本的工厂类
代码如下:
class myobject{
//对象将从工厂返回
}
class myfactory{
public static function factory(){
return new myobject():
}
}
$instance=myfactory::factory();
使用工厂类解析图像文件
代码如下:
_file=$file;
$this->_parse();
}
private function _parse(){
//完成png格式的解析工作
//并填充$_width,$_height,$_data;
}
public function getwidth(){
return $this->_width;
}
public function getheight(){
return $this->_height;
}
public function getdata(){
return $this->_data;
}
}
class image_jpeg implements iimage{
private $_width,$_height,$_data;
public function __construct($file){
$this->_file=$file;
$this->_parse();
}
private function _parse(){
//完成jpeg格式的解析工作
//并填充$_width,$_height,$_data;
}
public function getwidth(){
return $this->_width;
}
public function getheight(){
return $this->_height;
}
public function getdata(){
return $this->_data;
}
}
class imagefactory{
public static function factory($file){
$pathparts=pathinfo($file);
switch (strtolower($pathparts['extension']))
{
case 'jpg':
$ret=new image_jpeg($file);
break;
case 'png':
$ret=new image_png($file);
break;
default:
//有问题
}
if($ret instanceof iimage){
return $ret;
}else {
//有问题
}
}
}
//当使用图像文件名调用 工厂方法时,根据传入的文件类型不同,取得不同对象。
//调用imagefactoyr
$image=imagefactory::factory('/path/to/my.jpg');
//$image是image_jpeg类的一个实例
echo $image->getwidth();
使用工厂类解决数据库可移值性问题
在数据库应用程序中,工厂模式可以在以下两个方面起作用。
.使软件更容易支持各种不同的数据库平台,用于扩展用户群
.如果软件是内部使用,需要修改数据库时,可以容易将应用程序移值到别一个平台
在代码中,创建了一个名为user的数据库表来测试它,这个表定义一个名为email的varchar类型字段
代码如下:
_connection=pg_connect('dbname=example_db');
}
public function userexists($email){
$emailescaped=pg_escape_string($email);
$query=select 1 from users where email='.$emailescaped.';
if($result=pg_query($query,$this->_connection)){
return (pg_num_rows($result)>0)?true:false;
}else{
return false;
}
}
}
class mysql implements idatabasebindings{
protected $_connection;
public function __construct(){
$this->_connection=mysql_connect('localhost');
mysql_select_db('example_db',$this->_connection);
}
public function userexists($email){
$emailescaped=mysql_real_escape_string($email);
$query=select 1 from users where email='.$emailescaped.';
if($result=mysql_query($query,$this->_connection)){
return (mysql_num_rows($result)>0)?true:false;
}else{
return false;
}
}
}
class databasefactory{
public static function factory(){
$type=loadtypefromconfigfile();
switch ($type){
case 'pgsql':
return new pgsql();
break;
case 'mysql':
return new mysql();
break;
}
}
}
应用程序不必知道它与何种类型的数据库连接,只会基于idatabasebindings接口定义的规则直接与工厂返回的实例打交道。
代码如下:
//调用databasefactoy
$db=databasefactory::factory();
$db->userexists('person@example.com');