介绍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 相关文章推荐
php5编程中的异常处理详细方法介绍
Jul 29 PHP
PHP 图像尺寸调整代码
May 26 PHP
phpcms模块开发之swfupload的使用介绍
Apr 28 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
Nov 07 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
Jun 12 PHP
Smarty变量调节器失效的解决办法
Aug 20 PHP
php获取文件后缀的9种方法
Mar 22 PHP
php操作路径的经典方法(必看篇)
Oct 04 PHP
Laravel实现表单提交
May 07 PHP
php类自动装载、链式操作、魔术方法实现代码
Jul 23 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 PHP
Laravel 微信小程序后端搭建步骤详解
Nov 26 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/03 冲泡冲煮
php session 错误
2009/05/21 PHP
我的php学习笔记(毕业设计)
2012/02/21 PHP
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
javascript获取下拉列表框当中的文本值示例代码
2013/07/31 Javascript
jquery插件tooltipv顶部淡入淡出效果使用示例
2013/12/05 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
JavaScript入门基础
2015/08/12 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
浅述python2与python3的简单区别
2018/09/19 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
Python正则表达式学习小例子
2020/03/03 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
python学习将数据写入文件并保存方法
2020/06/07 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
python中xlutils库用法浅析
2020/12/29 Python
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
大二学期个人自我评价
2014/01/13 职场文书
团日活动总结怎么写
2014/06/25 职场文书
服务整改报告
2014/11/06 职场文书
JavaScript数组 几个常用方法总结
2021/11/11 Javascript