全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

PHP设计模式之工厂模式实例总结

本文实例讲述了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设计模式中工厂模式深入详解  # 中间层  # 都是  # 这样子  # 就会  # 就在  # 都要  # 连接数据库  # 创建一个  # 要使  # 支付方式  # 程序设计  # 类中  # 操作技巧  # 数据库类  # 几个  # 未来  # 这一  # 让我  # 也有  # 会有 


相关文章: 如何在万网自助建站平台快速创建网站?  微课制作网站有哪些,微课网怎么进?  网站制作企业,网站的banner和导航栏是指什么?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  如何选择建站程序?包含哪些必备功能与类型?  代刷网站制作软件,别人代刷火车票靠谱吗?  简单实现Android文件上传  清除minerd进程的简单方法  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  设计网站制作公司有哪些,制作网页教程?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  移民网站制作流程,怎么看加拿大移民官网?  如何在香港免费服务器上快速搭建网站?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  制作营销网站公司,淘特是干什么用的?  Python文件管理规范_工程实践说明【指导】  如何制作算命网站,怎么注册算命网站?  建站之星如何保障用户数据免受黑客入侵?  音乐网站服务器如何优化API响应速度?  如何在新浪SAE免费搭建个人博客?  如何在Windows虚拟主机上快速搭建网站?  已有域名和空间如何快速搭建网站?  javascript中的try catch异常捕获机制用法分析  高性价比服务器租赁——企业级配置与24小时运维服务  如何通过商城自助建站源码实现零基础高效建站?  如何通过虚拟主机空间快速建站?  如何在IIS7中新建站点?详细步骤解析  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  在线制作视频网站免费,都有哪些好的动漫网站?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  建站之星在线客服如何快速接入解答?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  如何注册花生壳免费域名并搭建个人网站?  如何选择适配移动端的WAP自助建站平台?  名字制作网站免费,所有小说网站的名字?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  如何快速建站并高效导出源代码?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  css网站制作参考文献有哪些,易聊怎么注册?  jQuery 常见小例汇总  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  建站之星上传入口如何快速找到?  C#怎么使用委托和事件 C# delegate与event编程方法  b2c电商网站制作流程,b2c水平综合的电商平台?  在线教育网站制作平台,山西立德教育官网?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。