介绍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利用header函数实现文件下载时直接提示保存
Nov 12 PHP
Zend Studio去除编辑器的语法警告设置方法
Oct 24 PHP
深入解析php之apc
May 15 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
Jun 13 PHP
ThinkPHP路由详解
Jul 27 PHP
php函数传值的引用传递注意事项分析
Jun 25 PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 PHP
数组任意位置插入元素,删除特定元素的实例
Mar 02 PHP
PHP 中TP5 Request 请求对象的实例详解
Jul 31 PHP
php合并数组并保留键值的实现方法
Mar 12 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
PHP 技巧 * SVG 保存为图片(分享图生成)
Apr 02 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
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
jquery.validate分组验证代码
2011/03/17 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
node.js中的fs.link方法使用说明
2014/12/15 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
json数据处理及数据绑定
2017/01/25 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
JavaScript模块模式实例详解
2017/10/25 Javascript
原生JS实现的轮播图功能详解
2018/08/06 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
详解Python中的from..import绝对导入语句
2016/06/21 Python
python实现K最近邻算法
2018/01/29 Python
Python内置模块logging用法实例分析
2018/02/12 Python
Python实现的读写json文件功能示例
2018/06/05 Python
Python3中的bytes和str类型详解
2019/05/02 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
Python随机数函数代码实例解析
2020/02/09 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
庆中秋节主题活动方案
2014/02/03 职场文书
债务纠纷起诉书
2015/05/20 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
保外就医申请书范文
2015/08/06 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL
详解分布式系统中如何用python实现Paxos
2021/05/18 Python
Django框架之路由用法
2022/06/10 Python