本文实例讲述了PHP设计模式之工厂模式。分享给大家供大家参考,具体如下:

使用工厂模式的目的或目标?
工厂模式的最大优点在于创建对象上面,就是把创建对象的过程封装起来,这样随时可以产生一个新的对象。
减少代码进行复制粘帖,耦合关系重,牵一发动其他部分代码。
通俗的说,以前创建一个对象要使用new,现在把这个过程封装起来了。
假设不使用工厂模式:那么很多地方调用类a,代码就会这样子创建一个实例:new a(),假设某天需要把a类的名称修改,意味着很多调用的代码都要修改。
工厂模式的优点就在创建对象上。
工厂模式的优点就在创建对象上。建立一个工厂(一个函数或一个类方法)来制造新的对象,它的任务就是把对象的创建过程都封装起来,
创建对象不是使用new的形式了。而是定义一个方法,用于创建对象实例。
每个类可能会需要连接数据库。那么就将连接数据库封装在一个类中。以后在其他类中通过类名:
为什么引入抽象的概念?
想一想,在现实生活中,当我们无法确定某个具体的东西的时候,往往把一类东西归于抽象类别。
工厂方法:
比如你的工厂叫做“香烟工厂”,那么可以有“七匹狼工厂”“中华工厂”等,但是,这个工厂只生厂一种商品:香烟;
抽象工厂:无法描述它到底生产什么产品,它生产很多类型的产品(所以抽象工厂就会生成子工厂)。
你的工厂是综合型的,是生产“一系列”产品,而不是“一个”,比如:生产“香烟”,还有“啤酒”等。然后它也可以有派生出来的具体的工厂,但这些工厂都是生产这一系列产品,只是可能因为地域不一样,为了适应当地人口味,味道也不太一样。
工厂模式:理解成只生成一种产品的工厂。比如生产香烟的。
工厂方法:工厂的一种产品生产线 。比如键盘的生成过程。
别人会反驳:吃饱了没事干,一定要修改类名称呢?这个说不定。一般都不会去修改类名称。
其实工厂模式有很多变体,抓住精髓才是关键:只要是可以根据不同的参数生成不同的类实例,那么就符合工厂模式的设计思想。
这样子让我联想到框架中经常会有负责生成具体类实例的方法供调用。
由于前面使用过phpcms,用phpcms的来帮助理解,更加好,如下:
pc_base:load_app_class("order"');//参数名称就是类名称。
将会生成得到order这个实例。传递不同的参数得到不同的类实例,这个就符合工厂模式。
pc_base:load_app_class("comment"');//生成一个comment类实例
当然load_app_class这个方法里面还会结合了单件模式的思想。避免调用n次,就重复创建n个相同的实例
工厂模式我想到的一个典型的应用就是:php可能要链接mysql,也可能要链接sqlserver,还有其他什么数据库。那么做一个抽象的数据库类,
这个类就是一个工厂类,专门负责产生不同的对象。
这样子做很方便扩展。我们在直接链接数据库的时候,不是使用代码
new Mysql($host,$username,$password,$dbname)
的形式
而可以动态生成一个连接数据库的实例。可以是mysql,也可以是连接oracle的。
class DbFactory
{
function static factory($db_class_name)
{
$db_class_name = strtolower($db_class_name);
if (include_once 'Drivers/' . $db_class_name . '.php') {
$classname = 'Driver_' . $db_class_name;
return new $db_class_name;
} else {
throw new Exception ('对应的数据库类没找到');
}
}
}
DbFactory::factory("mysql");
DbFactory::factory("oracle");
在thinkphp框架中也有对应的实现:
Db.class.php就是一个工厂类(也可以叫做数据库中间层,之所以叫做中间层,是因为可以操作mysql、oracle等各数据库。而这个类就是中间层作用,屏蔽掉具体的实现。让程序员可以不改动原来的查询代码。中间层来对接mysql、oracle等数据库。
Db.class.php中有个factory()方法来创建不同的数据库实例
public function factory($db_config='') {
// 读取数据库配置
$db_config = $this->parseConfig($db_config);
if(empty($db_config['dbms']))
throw_exception(L('_NO_DB_CONFIG_'));
// 数据库类型
$this->dbType = ucwords(strtolower($db_config['dbms']));
$class = 'Db'. $this->dbType;
if(is_file(CORE_PATH.'Driver/Db/'.$class.'.class.php')) {
// 内置驱动
$path = CORE_PATH;
}else{ // 扩展驱动
$path = EXTEND_PATH;
}
// 检查驱动类
if(require_cache($path.'Driver/Db/'.$class.'.class.php')) {
$db = new $class($db_config);
// 获取当前的数据库类型
if( 'pdo' != strtolower($db_config['dbms']) )
$db->dbType = strtoupper($this->dbType);
else
$db->dbType = $this->_getDsnType($db_config['dsn']);
if(APP_DEBUG) $db->debug = true;
}else {
// 类没有定义
throw_exception(L('_NOT_SUPPORT_DB_').': ' . $db_config['dbms']);
}
return $db;
}
还有做支付接口的时候,未来可能对应不同的支付网关:支付宝、财付通、网银在线等。方便未来扩展,设计成工厂模式。定一个专门生产网关接口的工厂,抽象出来,做成接口形式,让所有的子类都要实现它的接口。以后加一个支付方式,要使用哪一种支付方式,改变一下参数即可。
书籍<php权威编程>(英文名称为PHP 5 Power Programming)也提到一个工厂模式的例子,学到一招:在为用户注册的时候,分为很多种角色的用户。比如册用户,匿名用户、管理员用户等。完全使用可以使用工厂的思想来实现,代码也容易维护,为每种角色可以生成操作的类。
定义以下几个类:
UserFactory 用户工厂类,负责生成不同的用户类
User:用户类的基类,所有用户类都是继承这个类
不同角色的类:注册用户类、匿名用户类、管理员用户类
总结结束,欢迎指正!
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
# PHP
# 设计模式
# 工厂模式
# php设计模式之抽象工厂模式分析【星际争霸游戏案例】
# PHP设计模式之工厂模式(Factory)入门与应用详解
# php设计模式之工厂模式用法经典实例分析
# PHP设计模式之抽象工厂模式实例分析
# PHP设计模式之工厂模式定义与用法详解
# PHP设计模式之工厂模式详解
# PHP设计模式之工厂模式与单例模式
# PHP设计模式中工厂模式深入详解
# 中间层
# 都是
# 这样子
# 就会
# 就在
# 都要
# 连接数据库
# 创建一个
# 要使
# 支付方式
# 程序设计
# 类中
# 操作技巧
# 数据库类
# 几个
# 未来
# 这一
# 让我
# 也有
# 会有
相关文章:
,南京靠谱的征婚网站?
长沙企业网站制作哪家好,长沙水业集团官方网站?
建站主机选购指南与交易推荐:核心配置解析
Python路径拼接规范_跨平台处理说明【指导】
免费视频制作网站,更新又快又好的免费电影网站?
nginx修改上传文件大小限制的方法
如何通过虚拟主机空间快速建站?
公司门户网站制作流程,华为官网怎么做?
Python lxml的etree和ElementTree有什么区别
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
如何在建站主机中优化服务器配置?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
建站之星代理平台如何选择最佳方案?
建站主机核心功能解析:服务器选择与网站搭建流程指南
香港服务器部署网站为何提示未备案?
小程序网站制作需要准备什么资料,如何制作小程序?
如何在新浪SAE免费搭建个人博客?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
网站制作说明怎么写,简述网页设计的流程并说明原因?
制作网站的软件免费下载,免费制作app哪个平台好?
测试制作网站有哪些,测试性取向的权威测试或者网站?
中山网站推广排名,中山信息港登录入口?
在线教育网站制作平台,山西立德教育官网?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
清除minerd进程的简单方法
详解jQuery中基本的动画方法
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
如何在阿里云香港服务器快速搭建网站?
学校为何禁止电信移动建设网站?
,网页ppt怎么弄成自己的ppt?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
建站之星如何修改网站生成路径?
如何通过.red域名打造高辨识度品牌网站?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
如何在云主机快速搭建网站站点?
宝塔建站无法访问?如何排查配置与端口问题?
建站之星安装后如何自定义网站颜色与字体?
如何在搬瓦工VPS快速搭建网站?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
兔展官网 在线制作,怎样制作微信请帖?
平台云上自助建站如何快速打造专业网站?
湖北网站制作公司有哪些,湖北清能集团官网?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
制作农业网站的软件,比较好的农业网站推荐一下?
油猴 教程,油猴搜脚本为什么会网页无法显示?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。