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简单命令代码集锦
Sep 24 PHP
php学习笔记 数组遍历实现代码
Jun 09 PHP
php 多关键字 高亮显示实现代码
Apr 23 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 PHP
php下拉选项的批量操作的实现代码
Oct 14 PHP
自己写了一个php检测文件编码的函数
Apr 21 PHP
php+highchats生成动态统计图
May 21 PHP
php转换颜色为其反色的方法
Apr 27 PHP
php使用MySQL保存session会话的方法
Jun 18 PHP
PHP统计当前在线用户数实例讲解
Oct 21 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
Oct 16 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 数字左侧自动补0
2008/03/31 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
php短信接口代码
2016/05/13 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
2019/04/09 PHP
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
详解vue后台系统登录态管理
2019/04/02 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
Python装饰器原理与用法分析
2018/04/30 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
win7 x64系统中安装Scrapy的方法
2018/11/18 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
Django分页功能的实现代码详解
2019/07/29 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
10张动图学会python循环与递归问题
2021/02/06 Python
利用CSS3实现进度条的两种姿势详解
2017/03/21 HTML / CSS
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
电子商务专业个人的自我评价
2013/12/19 职场文书
解除劳动合同证明书
2014/09/26 职场文书
爱国主题班会教案
2015/08/14 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
python tkinter模块的简单使用
2021/04/07 Python
python语言中pandas字符串分割str.split()函数
2022/08/05 Python