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


Posted in PHP onJanuary 23, 2020

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

星际争霸是战略游戏,所以同样的兵种,敌我显示是不同的。
典型的就是鼠标的颜色,点中自己的物体的时候,鼠标颜色变成绿色,点中敌人的物体的时候,鼠标颜色变成红色。
还有就是每个物体的状态,点中自己的物体的时候,状态区显示完整的状态,点中敌人的物体的时候,状态区显示一部分信息。
我们假设只考虑鼠标和人族的运输船,玩家自己的运输船点中后状态区会显示里面装载的部队,而点中敌人的则不会显示里面是否装载部队。
这样我们就有四种对象:点中自己的鼠标,点中敌人的鼠标,自己的运输船状态,敌人的运输船状态。
如果用工厂方法模式,就要建立四个具体工厂(或者子工厂),这样的代码不便于维护和修改,因为我们以后要增加另一种情况:盟友。

待解决的问题:我们希望将这些对象联系起来,使得工厂的操作更加有逻辑性。

思路:既然我们通过自己和敌人来区分对象,那么统一归属的对象放入相同的具体工厂,每个具体工厂负责制造多种对象。

抽象工厂模式示例:

<?php
  //四个产品类
  //点中自己的物体时的鼠标
  class mineMouse
  {
    //鼠标的颜色
    public $color = 'green';
  }
  //点中敌人的物体时的鼠标
  class enemyMouse
  {
    //鼠标的颜色
    public $color = 'red';
  }
  //自己的运输船状态
  class mineDropship
  {
    //显示装载的情况,假设2辆坦克
    public $loading = '2 tanks';
  }
  //敌人的运输船状态
  class enemyDropship
  {
    //不显示装载的情况
    public $loading = '';
  }
  //主工厂类,也叫抽象工厂类
  class abstractCreator
  {
    //根据参数分配工作到具体的工厂,并返回具体工厂对象
    public function getCreator($belong)
    {
      //获取具体工厂的类名
      $creatorClassName = $belong.'Creator';
      //返回具体工厂对象
      return new $creatorClassName();
    }
  }
  //具体工厂必须执行的接口
  interface productCreator
  {
    //制造方法,或者说根据参数返回产品(鼠标,运输船)的方法
    public function creatProduct($productName);
  }
  //制造属于自己的物体的具体工厂,执行接口
  class mineCreator implements productCreator
  {
    //根据参数生产并返回属于自己的产品
    public function creatProduct($productName)
    {
      //获取产品的类名
      $productClassName = 'mine'.$productName;
      //返回产品对象
      return new $productClassName;
    }
  }
  //制造属于敌人的物体的具体工厂,执行接口
  class enemyCreator implements productCreator
  {
    //根据参数生产并返回属于敌人的产品
    public function creatProduct($productName)
    {
      //获取产品的类名
      $productClassName = 'enemy'.$productName;
      //返回产品对象
      return new $productClassName;
    }
  }
  //开始操作
  //新建抽象工厂对象
  $abstractCreator = new abstractCreator();
  //根据归属,得到具体工厂对象,这里先演示敌人的
  $realCreator1 = $abstractCreator->getCreator('enemy');
  //让具体工厂对象生产鼠标对象
  $product1 = $realCreator1->creatProduct('Mouse');
  //让鼠标对象显示颜色,显示结果red
  echo $product1->color;
  //根据归属,得到另一个具体工厂对象,这里演示自己的
  $realCreator2 = $abstractCreator->getCreator('mine');
  //让具体工厂对象生产运输船
  $product2 = $realCreator2->creatProduct('Dropship');
  //让运输船对象显示装载对象,显示结果2 tanks,两辆坦克
  echo $product2->loading;
?>

运行结果:

red2 tanks

用途总结:抽象工厂模式将拥有相同属性的产品归类到同一个具体工厂,减少具体工厂的数量,操作的时候,可以理清职责。

实现总结:需要一个根据属性返回具体工厂对象的抽象工厂,比如上面abstractCreator,同时需要将各个产品的属性(自己的,敌人的)进行归类,根据属性建立各个具体工厂,每个具体工厂制造多个具有相同属性的不同产品(鼠标和运输船)。

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

PHP 相关文章推荐
用PHP连接MySQL代码的参数说明
Jun 07 PHP
php self,$this,const,static,-&amp;gt;的使用
Oct 22 PHP
PHP 数组基础知识小结
Aug 20 PHP
php数据库抽象层 PDO
May 07 PHP
php Ubb代码编辑器函数代码
Jul 05 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
PHP 7.0.2 正式版发布
Jan 08 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
Feb 19 PHP
thinkphp自定义权限管理之名称判断方法
Apr 01 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
May 29 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
Dec 07 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
Jan 23 #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
You might like
PHP输出控制功能在简繁体转换中的应用
2006/10/09 PHP
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
jQuery 获取、设置HTML或TEXT内容的两种方法
2014/05/23 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
JS解析XML实例分析
2015/01/30 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
js为什么不能正确处理小数运算?
2015/12/29 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
通过python3实现投票功能代码实例
2019/09/26 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
国际书籍零售商:Wordery
2017/11/01 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
行政文员岗位职责
2013/11/08 职场文书
安全员岗位职责
2013/11/11 职场文书
销售经理工作职责范文
2013/12/03 职场文书
高校教师岗位职责
2014/03/18 职场文书
安全教育演讲稿
2014/05/09 职场文书
党员廉洁自律承诺书
2014/05/26 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python