介绍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安装攻略:常见问题解答(一)
Oct 09 PHP
Discuz 模板语句分析及知识技巧
Aug 21 PHP
完美实现GIF动画缩略图的php代码
Jan 02 PHP
php中Ctype函数用法详解
Dec 09 PHP
再推荐十款免费的php开发工具
Nov 09 PHP
php使用strip_tags()去除html标签仍有空白的解决方法
Jul 28 PHP
PHP封装的PDO数据库操作类实例
Jun 21 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
PHP实现的curl批量请求操作示例
Jun 06 PHP
php微信开发之谷歌测距
Jun 14 PHP
Laravel框架表单验证操作实例分析
Sep 30 PHP
PHP ElasticSearch做搜索实例讲解
Feb 05 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
如何开发一个虚拟域名系统
2006/10/09 PHP
PHP 验证码的实现代码
2011/07/17 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
Javascript 获取链接(url)参数的方法
2009/02/15 Javascript
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
详解ES6 Fetch API HTTP请求实用指南
2018/11/14 Javascript
vue实现在线翻译功能
2019/09/27 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
Python易忽视知识点小结
2015/05/25 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
Django的models中on_delete参数详解
2019/07/16 Python
python如何实现单链表的反转
2020/02/10 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
HTML5 通过Vedio标签实现视频循环播放的示例代码
2020/08/05 HTML / CSS
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
村干部任职承诺书
2015/01/21 职场文书
golang中字符串MD5生成方式总结
2021/07/04 Golang
httpclient调用远程接口的方法
2022/08/14 Java/Android