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微信支付通知的处理方式
May 25 PHP
ThinkPHP实现多数据库连接的解决方法
Jul 01 PHP
30个php操作redis常用方法代码例子
Jul 05 PHP
php给每个段落添加空格的方法
Mar 20 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
Dec 14 PHP
php获取当前页面完整URL地址
Dec 30 PHP
PHP浮点数的一个常见问题
Mar 10 PHP
一个简单安全的PHP验证码类 附调用方法
Jun 24 PHP
php简单统计中文个数的方法
Sep 30 PHP
PHP 中常量的知识整理
Apr 14 PHP
浅谈Yii乐观锁的使用及原理
Jul 25 PHP
php微信公众号开发之答题连闯三关
Oct 20 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
Mysql的常用命令
2006/10/09 PHP
PHP访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
JQuery 操作select标签实现代码
2010/05/14 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
JavaScript起点(严格模式深度了解)
2013/01/28 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
2017/05/03 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
利用原生js实现html5小游戏之打砖块(附源码)
2018/01/03 Javascript
快速处理vue渲染前的显示问题
2018/03/05 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
2020/11/11 Javascript
Python时间戳使用和相互转换详解
2017/12/11 Python
python绘制简单折线图代码示例
2017/12/19 Python
利用python实现微信头像加红色数字功能
2018/03/26 Python
django 文件上传功能的相关实例代码(简单易懂)
2020/01/22 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
解决pycharm下pyuic工具使用的问题
2020/04/08 Python
投资入股合作协议书
2014/10/28 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
2015年学生会个人工作总结
2015/04/09 职场文书
涨价通知怎么写
2015/04/23 职场文书
初中体育教学随笔
2015/08/15 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书
Python基础之字符串格式化详解
2021/04/21 Python