介绍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
服务器端解压缩zip的脚本
Dec 22 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 PHP
解析PHP提交后跳转
Jun 23 PHP
php页码形式分页函数支持静态化地址及ajax分页
Mar 28 PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
Oct 23 PHP
Zend Framework实现多文件上传功能实例
Mar 21 PHP
ucenter中词语过滤原理分析
Jul 13 PHP
php实现微信企业号支付个人的方法详解
Jul 26 PHP
PHP连接MySQL数据库并以json格式输出
May 21 PHP
PHP大文件分块上传功能实例详解
Jul 22 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
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
php实现指定字符串中查找子字符串的方法
2015/03/17 PHP
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
2019/05/06 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
JS 实现图片直接下载示例代码
2013/07/22 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
url传递的参数值中包含&时,url自动截断问题的解决方法
2016/08/02 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
layui表格实现代码
2017/05/20 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
vue学习笔记之Vue中css动画原理简单示例
2020/02/29 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
Pytorch 实现权重初始化
2019/12/31 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
推荐信模板
2014/05/09 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
歼十出击观后感
2015/06/11 职场文书
志愿者工作心得体会
2016/01/15 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
使用javascript解析二维码的三种方式
2021/11/11 Javascript
CentOS安装Nginx并部署vue
2022/04/12 Servers