PHP 工厂模式使用方法


Posted in PHP onMay 18, 2010

基本的工厂类

class MyObject{ 
//对象将从工厂返回 
} 
class MyFactory{ 
public static function factory(){ 
return new MyObject(): 
} 
} 
$instance=MyFactory::factory();

使用工厂类解析图像文件
<?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,$_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类型字段
<?php 
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('person@example.com');
PHP 相关文章推荐
第十四节 命名空间 [14]
Oct 09 PHP
php下使用以下代码连接并测试
Apr 09 PHP
php max_execution_time执行时间问题
Jul 17 PHP
php地址引用(php地址引用的效率问题)
Mar 23 PHP
PHP操作MongoDB GridFS 存储文件的详解
Jun 20 PHP
部署PHP项目应该注意的几点事项分享
Dec 20 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
Jun 09 PHP
php随机生成数字字母组合的方法
Mar 18 PHP
使用php-timeit估计php函数的执行时间
Sep 06 PHP
为你总结一些php信息函数
Oct 21 PHP
PHP针对字符串开头和结尾的判断方法
Jul 11 PHP
php实现的PDO异常处理操作分析
Dec 27 PHP
在PHP中使用反射技术的架构插件使用说明
May 18 #PHP
PHP 写文本日志实现代码
May 18 #PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
May 18 #PHP
PHP array_flip() 删除重复数组元素专用函数
May 16 #PHP
mysql下创建字段并设置主键的php代码
May 16 #PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 #PHP
ezSQL PHP数据库操作类库
May 16 #PHP
You might like
PHP读MYSQL中文乱码的解决方法
2006/12/17 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
js倒计时小程序
2013/11/05 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
Python实现子类调用父类的方法
2014/11/10 Python
在Django的session中使用User对象的方法
2015/07/23 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
Python 实例方法、类方法、静态方法的区别与作用
2019/08/14 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
法国房车租赁网站:Yescapa
2019/08/26 全球购物
求职者应聘的自我评价
2013/10/16 职场文书
自我鉴定200字
2013/10/28 职场文书
分厂厂长岗位职责
2013/12/29 职场文书
推荐信格式范文
2014/05/09 职场文书
事业单位考察材料范文
2014/12/25 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
赢在中国观后感
2015/06/02 职场文书
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js