为什么使用php工厂模式,PHP 工厂模式使用方法

class MyObject{

//对象将从工厂返回

}

class MyFactory{

public static function factory(){

return new MyObject():

}

}

$instance=MyFactory::factory();

使用工厂类解析图像文件

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,$_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类型字段

interface IDatabaseBindings{

public function userExists($email);

}

class PGSQL 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 ‘PGSQL‘:

return new PGSQL();

break;

case ‘MYSQL‘:

return new MYSQL();

break;

}

}

}

应用程序不必知道它与何种类型的数据库连接,只会基于IDatabaseBindings接口定义的规则直接与工厂返回的实例打交道。

//调用DatabaseFactoy

$db=DatabaseFactory::factory();

$db->userExists([email protected]);

原文:http://www.jb51.net/article/23551.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值