介绍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 相关文章推荐
搜索引擎技术核心揭密
Oct 09 PHP
php中使用__autoload()自动加载未定义类的实现代码
Feb 06 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
使用PHP实现阻止用户上传成人照片或者裸照
Dec 25 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
Apr 03 PHP
php获取远程文件大小
Oct 20 PHP
php htmlentities()函数的定义和用法
May 13 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
PHP实现的分解质因数操作示例
Aug 01 PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 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
PHP操作文件方法问答
2007/03/16 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
用js遍历 table的脚本
2008/07/23 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
js下用eval生成JSON对象
2010/09/17 Javascript
Javascript加载速度慢的解决方案
2014/03/11 Javascript
js判断游览器类型及版本号的代码
2014/05/11 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
微信小程序自定义组件
2017/08/16 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
Python合并多个装饰器小技巧
2015/04/28 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
python 实现UTC时间加减的方法
2018/12/31 Python
python匿名函数的使用方法解析
2019/10/10 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
个人自我鉴定
2013/11/07 职场文书
《童年的发现》教学反思
2014/02/14 职场文书
小学端午节活动方案
2014/03/13 职场文书
优秀大学生求职自荐信范文
2014/04/19 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python