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 相关文章推荐
PHP4实际应用经验篇(6)
Oct 09 PHP
php合并数组array_merge函数运算符加号与的区别
Oct 31 PHP
php利用header函数实现文件下载时直接提示保存
Nov 12 PHP
Php Image Resize图片大小调整的函数代码
Jan 17 PHP
PHP创建桌面快捷方式的实例代码
Feb 17 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
Nov 19 PHP
正确的PHP匹配UTF-8中文的正则表达式
May 13 PHP
php生成验证码函数
Oct 20 PHP
PHP实现正则匹配所有括号中的内容
Jun 22 PHP
PHP单例模式实例分析【防继承,防克隆操作】
May 22 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 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的知识
2006/11/17 PHP
php将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
jQuery的内容过滤选择器学习教程
2016/04/18 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
bootstrap timepicker在angular中取值并转化为时间戳
2017/06/13 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
2019/04/10 Javascript
小程序实现分类页
2019/07/12 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
详解Python的Django框架中的中间件
2015/07/24 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
python数字图像处理之高级形态学处理
2018/04/27 Python
python+os根据文件名自动生成文本
2019/03/21 Python
python函数与方法的区别总结
2019/06/23 Python
python 实现识别图片上的数字
2019/07/30 Python
python生成word合同的实例方法
2021/01/12 Python
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
伦敦的高级牛仔布专家:Trilogy
2018/08/06 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
师范生自荐信
2013/10/27 职场文书
老干部工作先进事迹
2014/08/17 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
详解Python内置模块Collections
2022/03/22 Python