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删除文件夹的三种方法
Jun 09 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
浅谈php和.net的区别
Sep 28 PHP
推荐10个提供免费PHP脚本下载的网站
Dec 31 PHP
利用PHP生成静态html页面的原理
Sep 30 PHP
Yii框架中jquery表单验证插件用法示例
Oct 18 PHP
php封装的smartyBC类完整实例
Oct 19 PHP
PHP使用GD库输出汉字的方法【测试可用】
Nov 10 PHP
由php中字符offset特征造成的绕过漏洞详解
Jul 07 PHP
PHP+RabbitMQ实现消息队列的完整代码
Mar 20 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
浅谈如何提高PHP代码质量之单元测试
May 28 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
将数字格式的计算结果转为汉字格式
2006/10/09 PHP
一个php短网址的生成代码(仿微博短网址)
2014/05/07 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
css图片自适应大小
2007/11/28 Javascript
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
javascript getElementsByName()的用法说明
2009/07/31 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
基于vue实现swipe轮播组件实例代码
2017/05/24 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
小程序绑定用户方案优化小结
2019/05/15 Javascript
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
详解Python的Lambda函数与排序
2016/10/25 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
男方父母婚礼答谢词
2014/01/25 职场文书
2014年酒店工作总结与计划
2014/11/17 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL