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加密解密的代码
Oct 09 PHP
PHP调用Webservice实例代码
Jul 29 PHP
PHP中PDO的错误处理
Sep 04 PHP
php获取$_POST同名参数数组的实现介绍
Jun 30 PHP
php获取指定日期之间的各个周和月的起止时间
Nov 24 PHP
php实现分页显示
Nov 03 PHP
php版微信公众号接口实现发红包的方法
Oct 14 PHP
php unicode编码和字符串互转的方法
Aug 12 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
Oct 08 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
php中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
js下获取div中的数据的原理分析
2010/04/07 Javascript
JS判断元素为数字的奇异写法分享
2012/08/01 Javascript
一个js过滤空格的小函数
2014/10/10 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
jQuery实现模糊查询的方法分析
2018/05/10 jQuery
Vuex实现数据增加和删除功能
2019/11/11 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
Python Queue模块详解
2014/11/30 Python
进一步了解Python中的XML 工具
2015/04/13 Python
python在不同层级目录import模块的方法
2016/01/31 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
几道PHP面试题
2013/04/14 面试题
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
酒店员工职业生涯规划
2014/02/25 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
2015年行政部工作总结
2015/04/28 职场文书
2015年小学二年级班主任工作总结
2015/05/21 职场文书
Go调用Rust方法及外部函数接口前置
2022/06/14 Golang