介绍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 相关文章推荐
php strstr查找字符串中是否包含某些字符的查找函数
Jun 03 PHP
用C/C++扩展你的PHP 为你的php增加功能
Sep 06 PHP
PHP中$_SERVER的详细参数与说明介绍
Oct 26 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
Jul 01 PHP
php实现的九九乘法口诀表简洁版
Jul 28 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
Nov 12 PHP
php+mysqli数据库连接的两种方式
Jan 28 PHP
php按字符无乱码截取中文的方法
Mar 27 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
CakePHP框架Model关联对象用法分析
Aug 04 PHP
workerman结合laravel开发在线聊天应用的示例代码
Oct 30 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 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
PHP实现多条件查询实例代码
2010/07/17 PHP
php实现文件编码批量转换
2014/03/10 PHP
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
javascript操作ul中li的方法
2015/05/14 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
JavaScript鼠标悬停事件用法解析
2020/05/15 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
利用python代码写的12306订票代码
2015/12/20 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python调用百度语音REST API
2018/08/30 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
pycharm的python_stubs问题
2020/04/08 Python
Python自动化xpath实现自动抢票抢货
2020/09/19 Python
python中random模块详解
2021/03/01 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
Tostadora意大利:定制T恤
2019/04/08 全球购物
中专生自我鉴定范文
2014/02/02 职场文书
关于环保的建议书
2014/05/12 职场文书
冬季安全检查方案
2014/05/23 职场文书
任命书格式
2014/06/05 职场文书
授权委托书
2014/07/31 职场文书
科技活动周标语
2014/10/08 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
金融专业银行实习证明模板
2014/11/28 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书