基本的工厂类
复制代码 代码如下:
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');
http://www.bkjia.com/phpjc/321890.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/321890.htmltecharticle基本的工厂类 复制代码 代码如下: class myobject{ //对象将从工厂返回 } class myfactory{ public static function factory(){ return new myobject(): } } $instance=my...
   
 
   