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详细彻底学习Smarty
Mar 27 PHP
在PHP中读取和写入WORD文档的代码
Apr 09 PHP
php 获取本机外网/公网IP的代码
May 09 PHP
Function eregi is deprecated (解决方法)
Jun 21 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
领悟php接口中interface存在的意义
Jun 27 PHP
php使用curl访问https示例分享
Jan 17 PHP
php银联网页支付实现方法
Mar 04 PHP
PHP实现通过正则表达式替换回调的内容标签
Jun 15 PHP
微信封装的调用微信签名包的类库
Jun 08 PHP
PhpStorm本地断点调试的方法步骤
May 21 PHP
Laravel配置全局公共函数的方法步骤
May 09 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 图片上传代码
2011/09/13 PHP
3款值得推荐的微信开发开源框架
2014/10/28 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
用YUI做了个标签浏览效果
2007/02/20 Javascript
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
解决Extjs上传图片无法预览的解决方法
2012/03/22 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
vue2.0 和 animate.css的结合使用
2017/12/12 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
深入理解 JS 垃圾回收
2019/06/03 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
pandas通过索引进行排序的示例
2018/11/16 Python
python实现三维拟合的方法
2018/12/29 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
图解Python中深浅copy(通俗易懂)
2020/09/03 Python
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
小学生演讲稿
2014/01/12 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
二手车转让协议书
2015/01/29 职场文书
2015年领班工作总结
2015/04/29 职场文书
2016年大学迎新晚会工作总结
2015/10/15 职场文书
pytorch 实现在测试的时候启用dropout
2021/05/27 Python
Python+Pillow+Pytesseract实现验证码识别
2022/05/11 Python
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers