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中在数据库中保存Checkbox数据(1)
Oct 09 PHP
PHP4引用文件语句的对比
Oct 09 PHP
用php实现百度网盘图片直链的代码分享
Nov 01 PHP
ThinkPHP框架实现session跨域问题的解决方法
Jul 01 PHP
php实现的CSS更新类实例
Sep 22 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
Aug 17 PHP
ThinkPHP3.2.1图片验证码实现方法
Aug 19 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
Oct 29 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
Jan 16 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
Jan 22 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 金额数字转换成英文
2010/05/06 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
推荐5款跨平台的PHP编辑器
2014/12/25 PHP
PHP滚动日志的代码实现
2015/06/10 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
Knockoutjs快速入门(经典)
2012/12/24 Javascript
jquery如何扑捉回车键触发的事件
2014/04/24 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
2016/09/19 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
jQuery选择器_动力节点Java学院整理
2017/07/05 jQuery
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
webpack+vue-cil 中proxyTable配置接口地址代理操作
2020/07/18 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
原生js实现自定义滚动条
2021/01/20 Javascript
Python中用altzone()方法处理时区的教程
2015/05/22 Python
简单学习Python time模块
2016/04/29 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
简单的python后台管理程序
2017/04/13 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
对python中的iter()函数与next()函数详解
2018/10/18 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
new修饰符是起什么作用
2015/06/28 面试题
大三学生入党思想汇报
2014/01/02 职场文书
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
2014年监理工作总结范文
2014/11/17 职场文书
家长会欢迎词
2015/01/23 职场文书
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis