介绍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版(1)
Oct 09 PHP
php截取字符串并保留完整xml标签的函数代码
Feb 06 PHP
PHP错误和异长常处理总结
Mar 06 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 PHP
PHP语法自动检查的Vim插件
Aug 11 PHP
php中实现记住密码下次自动登录的例子
Nov 06 PHP
php实现约瑟夫问题的方法小结
Mar 23 PHP
yii2实现 "上一篇,下一篇" 功能的代码实例
Feb 04 PHP
PHP实现数据库的增删查改功能及完整代码
Apr 18 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
May 29 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
laravel model 两表联查示例
Oct 24 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的Yii框架的组件化机制的基本知识
2016/03/17 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
javascript 新浪背投广告实现代码
2009/07/07 Javascript
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
jquery 查找select ,并触发事件的实现代码
2011/03/30 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
JavaScript实现同一页面内两个表单互相传值的方法
2015/08/12 Javascript
javascript创建对象、对象继承的实用方式详解
2016/03/08 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
浅析Ajax语法
2016/12/05 Javascript
Bootstrap媒体对象学习使用
2017/03/07 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
python+django加载静态网页模板解析
2017/12/12 Python
Python基础知识点 初识Python.md
2019/05/14 Python
Django框架自定义session处理操作示例
2019/05/27 Python
python匿名函数的使用方法解析
2019/10/10 Python
python爬虫要用到的库总结
2020/07/28 Python
python-地图可视化组件folium的操作
2020/12/14 Python
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
英文版餐饮运营管理求职信
2013/11/06 职场文书
大专生的学习自我评价
2013/12/04 职场文书
银行办理业务介绍信
2014/01/18 职场文书
幼儿园新年寄语
2014/04/03 职场文书
作风建设剖析材料
2014/10/06 职场文书
毕业设计论文评语
2014/12/31 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript