介绍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 相关文章推荐
一个可以删除字符串中HTML标记的PHP函数
Oct 09 PHP
PHP开发需要注意的安全问题
Sep 01 PHP
php强制下载类型的实现代码
Apr 21 PHP
解析thinkphp中的导入文件标签
Jun 20 PHP
wordpress自定义url参数实现路由功能的代码示例
Nov 28 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
Sep 10 PHP
Yii框架调试心得--在页面输出执行sql语句
Dec 25 PHP
网站防止被刷票的一些思路与方法
Jan 08 PHP
PHP数组操作类实例
Jul 11 PHP
Zend Framework路由器用法实例详解
Dec 11 PHP
PHP7内核之Reference详解
Mar 14 PHP
laravel框架实现敏感词汇过滤功能示例
Feb 15 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
用JAVASCRIPT如何给<textarea></textarea>赋值
2007/04/20 Javascript
SWFObject Flash js调用类
2008/07/08 Javascript
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
input输入框的自动匹配(原生代码)
2013/03/19 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
js 通用订单代码
2013/12/23 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
AngularJS实现的锚点楼层跳转功能示例
2018/01/02 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
深入理解ES6中let和闭包
2018/02/22 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
python实现指定字符串补全空格的方法
2015/04/30 Python
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
python async with和async for的使用
2019/06/20 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
化学相关工作求职信
2013/10/02 职场文书
电子商务应届生求职信
2013/11/16 职场文书
服装创业计划书范文
2014/02/05 职场文书
电影雨中的树观后感
2015/06/15 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
浅谈Python列表嵌套字典转化的问题
2021/04/07 Python
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android