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 中的批处理的实现
Jun 14 PHP
phpMyAdmin链接MySql错误 个人解决方案
Dec 28 PHP
windows下升级PHP到5.3.3的过程及注意事项
Oct 12 PHP
PHP利用str_replace防注入的方法
Nov 10 PHP
Laravel 4.2 中队列服务(queue)使用感受
Oct 30 PHP
PHP截取指定图片大小的方法
Dec 10 PHP
PHP中的替代语法介绍
Jan 09 PHP
php生出随机字符串
Jul 06 PHP
Laravel框架实现利用中间件进行操作日志记录功能
Jun 06 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
Apr 23 PHP
php use和include区别总结
Oct 13 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获取mysql数据库中的所有表名的代码
2011/04/23 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
PHP加密解密字符串汇总
2015/04/26 PHP
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
js实现简单秒表走动的时钟特效
2020/03/25 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
基于node.js express mvc轻量级框架实践
2017/09/14 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
Django框架视图函数设计示例
2019/07/29 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
2020/09/20 Python
利用python实现汉诺塔游戏
2021/03/01 Python
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
成品仓管员岗位职责
2013/12/11 职场文书
环保专业大学生职业规划设计
2014/01/10 职场文书
2014年终个人总结报告
2015/03/09 职场文书
薪资证明范本
2015/06/19 职场文书
2016继续教育研修日志
2015/11/13 职场文书
详解python字符串驻留技术
2021/05/21 Python
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS
HTML基本元素标签介绍
2022/02/28 HTML / CSS