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 相关文章推荐
php注入实例
Oct 09 PHP
一个查看session内容的函数
Oct 09 PHP
建立动态的WML站点(三)
Oct 09 PHP
PHP中获取变量的变量名的一段代码的bug分析
Jul 07 PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
Jun 17 PHP
PHP环境中Memcache的安装和使用
Nov 05 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
php基于jquery的ajax技术传递json数据简单实例
Apr 15 PHP
Ubuntu 16.04下安装PHP 7过程详解
Mar 28 PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 PHP
PHP序列化和反序列化深度剖析实例讲解
Dec 29 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 Smarty 字符比较代码
2011/02/27 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
php时间计算相关问题小结
2016/05/09 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
js综合应用实例简单的表格统计
2013/09/03 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
彻底弄懂 JavaScript 执行机制
2018/10/23 Javascript
js验证身份证号码记录的方法
2019/04/26 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
python 域名分析工具实现代码
2009/07/15 Python
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
Python随手笔记之标准类型内建函数
2015/12/02 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
每天迁移MySQL历史数据到历史库Python脚本
2018/04/13 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
8种常用的Python工具
2020/08/05 Python
python如何实现递归转非递归
2021/02/25 Python
英国名牌男装店:Standout
2021/02/17 全球购物
介绍一下MD5加密算法
2016/11/12 面试题
优秀的自荐信要注意哪些
2014/01/03 职场文书
销售演讲稿范文
2014/01/08 职场文书
指导教师评语
2014/04/26 职场文书
开工仪式策划方案
2014/05/23 职场文书
干部对照检查材料范文
2014/08/26 职场文书
2015年“七七卢沟桥事变”纪念活动总结
2015/03/24 职场文书
快速学习Oracle触发器和游标
2021/06/30 Oracle
python中__slots__节约内存的具体做法
2021/07/04 Python
Apache自带的ab压力测试工具的实现
2022/07/23 Servers