介绍php设计模式中的工厂模式


Posted in PHP onJune 12, 2008

问题

你如何能轻松方便地建立这么" 复杂 " 的对象即操作中不需要粘贴复制呢?

解决方法

建立一个工厂(一个函数或一个类方法)来制造新的对象。为了理解工厂的用处, 试想以下的不同之处……

代码:

$connection =& new MySqlConnection($user, $password, $database); 

……使你的代码可扩展和更简洁……
$connection =& create_connection(); 

后者的代码片断集中在和数据库连接的create_connect()工厂上 ,就像刚才说的一样,使创造数据库连接的过程成为一个简单的操作—就像new操作一样。工厂模式的优点就在创建对象上。 它的任务就是把对象的创建过程都封装起来,然后返回一个所需要的新类。

想改变对象的结构和建立对象的方式吗? 你只需选择对象工厂,对代码的改变只需要一次就够了。( 工厂模式的功能是如此强大, 它处于是应用的底层, 所以在许多其余的复杂模式和应用中它会不停地出现。)

样本代码

工厂模式封装了对象的建立过程。 你可以在对象本身创建对象工厂或者是一个额外的工厂类——这要看你具体的应用。让我们看一个工厂对象的例子。

我们发现下面代码中,数据库连接的那部分屡次出现:

// PHP4  
class Product {  
function getList() { $db =& new MysqlConnection(DB_USER, DB_PW, DB_NAME);  
//...  
}  
function getByName($name) { $db =& new MysqlConnection(DB_USER, DB_PW, DB_NAME);  
//...  
}  
//...  
} 
为什么这样做不好? 数据库连接的参数出现的地方太多了,当你把这些参数设成常量,意味着你统一定义并对他们进行赋值,显然这种做法不是很妥当:

你可以轻松地改变连接数据库的参数,但你不能增加或改变这些参数地顺序,除非你把所有连接代码都改了。
你不能轻松的实例化一个新类去连接另一种数据库,比如说PostgresqlConnection。
这样很难单独测试和证实连接对象的状态。
使用工厂设计模式,代码将得到很大的改进:

class Product {  
function getList() {  
$db =& $this->_getConnection();  
//...  
}  
function &_getConnection() {  
return new MysqlConnection(DB_USER, DB_PW, DB_NAME);  
}  
} 
先前的类中存在很多调用new MysqlConnection(DB_USER,  DB_PW,  DB_NAME)的方法,现在都被集中到的_getConnection()方法上。
PHP 相关文章推荐
不用iconv库的gb2312与utf-8的互换函数
Oct 09 PHP
第二节--PHP5 的对象模型
Nov 16 PHP
PHP 函数学习简单小结
Jul 08 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
Oct 29 PHP
php中使用$_REQUEST需要注意的一个问题
May 02 PHP
PHP获取当前页面完整URL的实现代码
Jun 10 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
php实现查看邮件是否已被阅读的方法
Dec 03 PHP
如何写php守护进程(Daemon)
Dec 30 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
PHP实现随机发扑克牌
Apr 22 PHP
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
Apr 01 PHP
php mysql索引问题
Jun 07 #PHP
PHP中MD5函数使用实例代码
Jun 07 #PHP
PHP时间戳使用实例代码
Jun 07 #PHP
PHP-MySQL教程归纳总结
Jun 07 #PHP
PHP实现MySQL更新记录的代码
Jun 07 #PHP
用PHP连接MySQL代码的参数说明
Jun 07 #PHP
PHP简单系统数据添加以及数据删除模块源文件下载
Jun 07 #PHP
You might like
星际实力自我测试
2020/03/04 星际争霸
一家之言的经验之谈php+mysql扎实个人基本功
2008/03/27 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
ThinkPHP模板中数组循环实例
2014/10/30 PHP
smarty模板数学运算示例
2016/12/11 PHP
javascript中强制执行toString()具体实现
2013/04/27 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
js function定义函数的几种不错方法
2014/02/27 Javascript
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
图解Python变量与赋值
2018/04/03 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
详解python中各种文件打开模式
2020/01/19 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
教育学习自我评价
2014/02/03 职场文书
中国梦我的梦演讲稿
2014/04/23 职场文书
勾股定理课后反思
2014/04/26 职场文书
统招统分证明
2015/06/23 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
中学教师教学工作总结
2015/08/13 职场文书
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技
python中validators库的使用方法详解
2022/09/23 Python