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 相关文章推荐
在WIN98下以apache模块方式安装php
Oct 09 PHP
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
Mar 29 PHP
PHP面向对象分析设计的61条军规小结
Jul 17 PHP
thinkphp3.0 模板中函数的使用
Nov 13 PHP
php如何调用webservice应用介绍
Nov 24 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
Mar 16 PHP
PHP发送短信代码分享
Aug 11 PHP
PHP实现的简单异常处理类示例
May 04 PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 PHP
PHP var关键字相关原理及使用实例解析
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
PHP4实际应用经验篇(3)
2006/10/09 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
php分页函数示例代码分享
2014/02/24 PHP
php+mysql数据库查询实例
2015/01/21 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
vue实现购物车小案例
2019/09/27 Javascript
Python对列表排序的方法实例分析
2015/05/16 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
python正则表达式爬取猫眼电影top100
2018/02/24 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
详解小白之KMP算法及python实现
2019/04/04 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
欧尚俄罗斯网上超市:Auchan俄罗斯
2018/05/03 全球购物
英国女鞋购物网站:Moda in Pelle
2019/02/18 全球购物
印尼网上商店:Alfacart.com
2019/03/11 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
德国苹果商店:MacTrade
2020/05/18 全球购物
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
社区党员先进事迹
2014/01/22 职场文书
军神教学反思
2014/02/04 职场文书
《美丽的公鸡》教学反思
2014/02/25 职场文书
村道德模范事迹材料
2014/08/28 职场文书
租房协议书范例
2014/10/14 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
神龙架导游词
2015/02/11 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL