工厂模式在Zend Framework中应用介绍


Posted in PHP onJuly 10, 2012

首先我们先引用些概念:
工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有其同的父类。工厂模式属于类的创建模式,通常根据自变量的不同返回不同类的实例。
工厂模式的实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品的实例。工厂模式式涉及到工厂角色、抽象产品角色和具体产品角色。
工厂(Creator)角色:是工厂模式的核心,它负责实现创建所有实例的内部逻。工厂类可以被外界直接调用,创建所需产品对象。
抽象产品(Product)角色:是工厂模式所创建所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:是工厂模式的创建目标,所有的对象都是充当这个角色的某个具体类的实例。
ZF中的zend_db就是工厂模式的一个很好的例子。
接下来就开始进行分析。。。。。。
配置zf的时候,我们可以将数据库的连接操作信息放在Bootstrap.php文件中

<?php 
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
function __construct($app){ 
parent::__construct($app); 
$url=constant('APPLICATION_PATH').DIRECTORY_SEPARATOR.'configs'.DIRECTORY_SEPARATOR.'config.ini'; 
$dbconfig=new Zend_Config_Ini($url,null,true); 
$db=Zend_Db::factory($dbconfig->general->db->adapter,$dbconfig->general->db->params->toArray()); 
// var_dump($db); 
$db->query('SET NAMES UTF8'); 
Zend_Db_Table::setDefaultAdapter($db); 
} 
} 
?>

在入口文件处,通过一个Zend_Application对象来调用bootstrap(),类Bootstrap的构造函数就会被调用。
在构造函数中,通过Zend_Db::factory()我们就能得到一个操作数据库的对象实例。
通过一个Zend_Config_Ini 实例读取config.ini中相关信息作为参数传递给工厂函数Zend_Db::factory()
config.ini 的信息
[general]
db.adapter =PDO_MYSQL
db.params.host =localhost
db.params.username =root
db.params.password =
db.params.dbname = 数据库名
Zend_Db::factory()
其中参数一:表示要操作的数据库类型,比如PDO_MYSQL
参数二:表示连接数据库的信息,包括服务器名,用户名,密码,要连接的数据库

先抛出两个提个问题:
①如果我们要操作的数据库是MSSQL,该怎么操作
②这里我们使用的是Zend_Db::factory(),如果我们使用传统的方式,该怎么操作

解答:
① 我们只需要在config.ini文件中将PDO_MYSQL修改成PDO_MSSQL即可
② 传统方式创建一个操作数据库的对象实例:
$db=new Zend_Db_Adapter_Pdo_Mysql($config)
其中:$config信息从config.ini中读取
问题来了:我们使用传统的方式来创建一个对象实例的话,我们必然有一个流程来判断当前要操作的数据库类型吧?
比如:

switch ($dbType){ 
case 'PDO_MYSQL': 
.... 
case 'PDO_MSSQL': 
.... 
case 'PDO_SQLITE': 
.... 
}

我们还得根据不同的数据库类型,写不同的操作数据库的语句,这样岂不是很麻烦
但是,这一切的一切,zf通过工厂模式都已经帮我们做好了,使用起来非常方便

Zf中如何是如何实现工厂模式的呢?
首先,得有一个抽象基类:Zend_Db_Adapter_Abstract,该类是工厂模式所创建的所有对象的父类,他负责提供所有实例要所共有的接口。
该类不仅提供了一些我们非常熟悉操作数据库的实现方法,比如:select,update,insert,delete,query,fetchRow,fetchAssoc;另外,也提供了一些接口,用以在子类中进行实现,比如:limit,getServerVersion,closeConnection,describeTable等等

abstract class Zend_Db_Adapter_Abstract 
{ 
//.. 
} 
abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract 
{ 
//.. 
} 
class Zend_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Abstract 
{ 
//...实现针对Mysql数据库的操作 
} 
class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract 
{ 
//....实现针对Mssql数据库的操作 
} 
class Zend_Db_Adapter_Pdo_Sqlite extends Zend_Db_Adapter_Pdo_Abstract 
{ 
//....实现针对Sqlite数据库的操作 
}

以上关系可以用一张图简单的表示出来

工厂模式在Zend Framework中应用介绍
接下来,我们跟踪下Zend_Db::Factory()到底是实现根据不同的参数选择不同的数据库的。

工厂模式在Zend Framework中应用介绍

PHP 相关文章推荐
搜索和替换文件或目录的一个好类--很实用
Oct 09 PHP
php URL编码解码函数代码
Mar 10 PHP
php实现快速排序的三种方法分享
Mar 12 PHP
ThinkPHP3.1数据CURD操作快速入门
Jun 19 PHP
PHP中使用TCPDF生成PDF文档实例
Jul 01 PHP
PHP实现全角字符转为半角方法汇总
Jul 09 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
Mar 23 PHP
thinkPHP2.1自定义标签库的导入方法详解
Jul 20 PHP
php实现微信支付之退款功能
May 30 PHP
PHP里的$_GET数组介绍
Mar 22 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
Dec 12 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
Jul 07 #PHP
php数据库配置文件一般做法分享
Jul 07 #PHP
php中配置文件操作 如config.php文件的读取修改等操作
Jul 07 #PHP
php中CI操作多个数据库的代码
Jul 05 #PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 #PHP
PHP中使用unset销毁变量并内存释放问题
Jul 05 #PHP
php Ubb代码编辑器函数代码
Jul 05 #PHP
You might like
德生PL990的分析评价
2021/03/02 无线电
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
PHP安全上传图片的方法
2015/03/21 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
layer设置maxWidth及maxHeight解决方案
2019/07/26 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
vue实现侧边栏导航效果
2019/10/21 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[01:04:49]KG vs LGD 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python中字典的基本知识初步介绍
2015/05/21 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
谢师宴答谢词
2015/01/05 职场文书
后勤工作个人总结
2015/02/28 职场文书
工地材料员岗位职责
2015/04/11 职场文书
老公出轨后的保证书
2015/05/08 职场文书
资金申请报告范文
2015/05/14 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书