介绍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 相关文章推荐
global.php
Dec 09 PHP
PHP生成带有雪花背景的验证码
Sep 28 PHP
php递归实现无限分类生成下拉列表的函数
Aug 08 PHP
php小型企业库存管理系统的设计与实现代码
May 16 PHP
win平台安装配置Nginx+php+mysql 环境
Jan 12 PHP
PHP getallheaders无法获取自定义头(headers)的问题
Mar 23 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
May 20 PHP
简单谈谈PHP中的trait
Feb 25 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 PHP
php使用curl模拟多线程实现批处理功能示例
Jul 25 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
apache和PHP如何整合在一起
2015/10/12 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
如何选择适合你的JavaScript框架
2017/11/20 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
js+css实现打字效果
2020/06/24 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
JS实现公告上线滚动效果
2021/01/10 Javascript
python格式化字符串实例总结
2014/09/28 Python
python 实现在Excel末尾增加新行
2018/05/02 Python
python实现NB-IoT模块远程控制
2018/06/20 Python
浅谈python之新式类
2018/08/12 Python
python 美化输出信息的实例
2018/10/15 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
以下的初始化有什么区别
2013/12/16 面试题
社区党员公开承诺书
2014/08/30 职场文书
党员批评与自我批评范文
2014/09/23 职场文书
2014年党委工作总结
2014/11/22 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
年终工作总结范文
2019/06/20 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
Python中tkinter的用户登录管理的实现
2021/04/22 Python