php设计模式之工厂方法模式分析【星际争霸游戏案例】


Posted in PHP onJanuary 23, 2020

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

PHP手册上提到的工厂模式,其实是简单工厂模式。这里来讨论简单工厂模式的扩展:工厂方法模式。

待解决的问题:虽然简单工厂解决了动态返回不同类型对象的问题,但是实际情况当中,往往在新建一个对象的时候,需要做一些额外处理,比如制造机枪兵的时候需要判断水晶矿是否大于50,而制造火焰兵的时候需要同时判断水晶矿是否大于50和气矿大于25,还有是否建造了研究院。如果把这些代码全部放到工厂制造类里面,会使得制造类很臃肿,而且随着工厂生产的对象的种类越来越多,工厂制造类的代码会越来越难以维护。

思路:简单工厂模式中的工厂类(兵种制造器的类)保持不变,增加一个制造接口,定义一个实际制造对象的方法,然后定义各个具体制造不同对象的工厂,同时要求这些工厂执行这个制造接口,让这些工厂去实现实际制造对象的方法。

工厂方法模式示例:

我们把机枪兵类和制造机枪兵的类的代码放入一个文件,Marine.php,它的代码如下:

<?php
  //机枪兵类
  class Marine
  {
    //机枪兵攻击的方法
    public function attack()
    {
      echo 'Marine attack';
    }
  }
  //制造机枪兵的类,执行接口abstractCreator
  class MarineCreator implements abstractCreator
  {
    //实际制造机枪兵的方法
    public function realCreate()
    {
      //如果水晶矿大于50,这里只是作为说明,因为并不存在ore这个变量,也不考虑水晶少于50的处理
      if($ore>50)
      {
        return new Marine();
      }
    }
  }
?>

我们把火焰兵类和制造火焰兵的类的代码放入一个文件,Firebat.php,它的代码如下:

<?php
  //火焰兵类
  class Firebat
  {
    //火焰兵攻击的方法
    public function attack()
    {
      echo 'Firebat attack';
    }
  }
  //制造火焰兵的类,执行接口abstractCreator
  class FirebatCreator implements abstractCreator
  {
    //实际制造火焰兵的方法
    public function realCreate()
    {
      //如果水晶矿大于50同时气矿大于25,并且研究院已经存在。这里只是作为说明,因为并不存在ore和gas和Academy变量,也不考虑资源不够时的处理
      if($ore>50 && $gas>25 && Academy>1)
      {
        return new Firebat();
      }
    }
  }
?>

主文件中的内容如下:

<?php
  //各个具体工厂必须执行的接口
  interface abstractCreator
  {
    //规定各个具体工厂要实现的方法
    public function realCreate();
  }
  //兵种制造器的类,也就是主工厂
  class BarracksCreator
  {
    //制造兵种的方法
    public create($createWhat)
    {
      //根据输入的参数,动态的把需要的类的定义文件载入
      require_once($createWhat.'.php');
      //根据输入的参数,动态的获取相应的具体工厂的类的名字
      $creatorClassName = $createWhat.'Creator';
      //新建具体工厂对象
      $creator = new $creatorClassName;
      //用具体工厂来实际生产,然后返回需要的类的对象。因为它们都执行了接口abstractCreator,所以肯定实现了方法realCreate()
      return $creator->realCreate();
    }
  }
  //新建一个兵种制造器对象
  $creator = new BarracksCreator();
  //靠接收参数制造一个火焰兵对象
  $troop1 = $creator->create('Marine');
  $troop1->attack();
  //靠接收参数制造一个机枪兵对象
  $troop2 = $creator->create('Firebat');
  $troop2->attack();
?>

用途总结:工厂方法模式将新建对象的任务将给对应的具体工厂类,不必因为某些生产的对象需要进行额外处理而修改对外的主工厂。

实现总结:需要接收参数的主工厂类,比如上面兵种制造器BarracksCreator,还需要声明具体制造方法的一个接口,比如上面abstractCreator,然后定义具体生产各个产品的具体工厂类,每个具体工厂类必须执行接口abstractCreator,这样他们就必须实现制造对象的方法,比如上面的realCreate()。使用的时候只需要将参数传递给主工厂类工厂的生产方法create(),然后由create()根据参数生成具体工厂类的对象,并调用具体工厂类realCreate()获取制造的产品对象并返回,对外界使用来说,只需调用主工厂类工厂进行生产。
说明:其实这篇文章内的工厂方法模式和有些文章写的不同,标准的工厂模式往往是用一个抽象类来代替上面的接口abstractCreator,然后让所有的具体工厂类来继承它,但使用的时候,由于抽象类不能实例化(新建它的对象),所以经常是代码中直接new FirebatCreator(),但是简单工厂模式可以解决直接new的问题,所以我这里将简单工厂模式和工厂方法模式一起使用,使这里的示例更加实用。同时由于PHP是单继承,而执行接口的数量是没有限制的,所以使用接口abstractCreator更加灵活。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
如何在PHP中使用Oracle数据库(2)
Oct 09 PHP
php 保留小数点
Apr 21 PHP
基于Windows下Apache PHP5.3.1安装教程
Jan 08 PHP
php页面跳转代码 输入网址跳转到你定义的页面
Mar 28 PHP
smarty缓存用法分析
Dec 16 PHP
php返回字符串中所有单词的方法
Mar 09 PHP
ThinkPHP中order()使用方法详解
Apr 19 PHP
PHP测试框架PHPUnit组织测试操作示例
May 28 PHP
Mac下快速搭建PHP开发环境步骤详解
May 05 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 PHP
Yii 框架使用Forms操作详解
May 18 PHP
Laravel统一错误处理为JSON的方法介绍
Oct 18 PHP
php面向对象基础详解【星际争霸游戏案例】
Jan 23 #PHP
PHP数据源架构模式之表入口模式实例分析
Jan 23 #PHP
TP3.2.3框架文件上传操作实例详解
Jan 23 #PHP
php的RSA加密解密算法原理与用法分析
Jan 23 #PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
Jan 23 #PHP
PHP实现一个按钮点击上传多个图片操作示例
Jan 23 #PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Jan 22 #PHP
You might like
《心理测量者3》剧场版动画预告
2020/03/02 日漫
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
基于javascript实现listbox左右移动
2016/01/29 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Python制作词云图代码实例
2019/09/09 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
英语专业推荐信
2013/11/16 职场文书
校友会欢迎辞
2014/01/13 职场文书
高级销售求职信
2014/02/21 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
项目验收申请报告
2015/05/15 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
使用Django实现商城验证码模块的方法
2021/06/01 Python
15个值得收藏的JavaScript函数
2021/09/15 Javascript
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server