PHP 工厂模式使用方法
前端之家收集整理的这篇文章主要介绍了
PHP 工厂模式使用方法,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
基本的工厂类
<div class="codetitle"><a style="CURSOR: pointer" data="57108" class="copybut" id="copybut57108" onclick="doCopy('code57108')"> 代码如下:
<div class="codebody" id="code57108">
class MyObject{
//对象将从工厂返回
}
class MyFactory{
public static function factory(){
return new MyObject():
}
}
$instance=MyFactory::factory();
使用工厂类解析图像
文件 <div class="codetitle">
<a style="CURSOR: pointer" data="48822" class="copybut" id="copybut48822" onclick="doCopy('code48822')"> 代码如下: <div class="codebody" id="code48822">
<?
PHP interface IImage{
function getHeight();
function getWidth();
function getData();
}
class Image_PNG implements IImage{
private $_width,$_height,$_data;
public function
construct($file){
$this->_file=$file;
$this->_parse();
}
private function _parse(){
//完成PNG格式的解析工作
//并填充$_width,$_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,$_data;
public function construct($file){
$this->_file=$file;
$this->_parse();
}
private function _parse(){
//完成JPEG格式的解析工作
//并填充$_width,$_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类型字段
<div class="codetitle">
<a style="CURSOR: pointer" data="26796" class="copybut" id="copybut26796" onclick="doCopy('code26796')"> 代码如下: <div class="codebody" id="code26796">
<?
PHP interface IDatabaseBindings{
public function userExists($email);
}
class PG
sql implements IDatabaseBindings{
protected $_connection;
public function construct(){
$this->_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 'PG
sql':
return new PG
sql();
break;
case '
MysqL':
return new
MysqL();
break;
}
}
}