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 CLI实现简单的数据库实时监控调度
Jul 01 PHP
php空间不支持socket但支持curl时recaptcha的用法
Nov 07 PHP
php中的一些数组排序方法分享
Jul 20 PHP
php header功能的使用
Oct 28 PHP
php下载excel无法打开的解决方法
Dec 24 PHP
php获取中文拼音首字母类和函数分享
Apr 24 PHP
PHP闭包实例解析
Sep 08 PHP
Mac环境下php操作mysql数据库的方法分享
May 11 PHP
PHP jQuery+Ajax结合写批量删除功能
May 19 PHP
Yii框架创建cronjob定时任务的方法分析
May 23 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
Feb 03 PHP
laravel数据库查询结果自动转数组修改实例
Feb 27 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数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
2011/10/29 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
zend framework重定向方法小结
2016/05/28 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
python实现内存监控系统
2021/03/07 Python
pytorch中的transforms模块实例详解
2019/12/31 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
Python之Sklearn使用入门教程
2021/02/19 Python
纯css3制作网站后台管理面板
2014/12/30 HTML / CSS
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
内刊编辑求职自荐书范文
2014/02/19 职场文书
大学运动会入场词
2014/02/22 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
升学宴祝酒词
2015/08/11 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL