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 相关文章推荐
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
Jul 01 PHP
PHP时间格式控制符对照表分享
Jul 23 PHP
php mail to 配置详解
Jan 16 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
Jun 19 PHP
YII Framework框架教程之日志用法详解
Mar 14 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
laravel配置Redis多个库的实现方法
Apr 10 PHP
PHP代码加密的方法总结
Mar 13 PHP
通过实例解析PHP数据类型转换方法
Jul 11 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绘制圆形的方法
2015/01/24 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
jQuery+jRange实现滑动选取数值范围特效
2015/03/14 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
Python使用getpass库读取密码的示例
2017/10/10 Python
python基础教程项目三之万能的XML
2018/04/02 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
浅谈Python中的字符串
2020/06/10 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
如何用 Python 制作 GitHub 消息助手
2021/02/20 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
百联网上商城:i百联
2017/01/28 全球购物
用Python写一个for循环的例子
2016/07/19 面试题
便利店投资的创业计划书
2014/01/12 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
小学学校门卫岗位职责
2014/08/03 职场文书
平面设计师岗位职责
2014/09/18 职场文书
公司证明怎么写
2014/09/22 职场文书
2015元旦标语横幅
2014/12/09 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
小英雄雨来观后感
2015/06/09 职场文书
小学班主任心得体会
2016/01/07 职场文书
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js