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 相关文章推荐
模拟OICQ的实现思路和核心程序(二)
Oct 09 PHP
php模板之Phpbean的目录结构
Jan 10 PHP
PHP安全性漫谈
Jun 28 PHP
php判断数组元素中是否存在某个字符串的方法
Jun 14 PHP
ThinkPHP查询中的魔术方法简述
Jun 25 PHP
php+xml编程之xpath的应用实例
Jan 24 PHP
PHP代码实现表单数据验证类
Jul 28 PHP
php好代码风格的阶段性总结
Jun 25 PHP
php安装扩展mysqli的实现步骤及报错解决办法
Sep 23 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
Apr 27 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
Apr 14 PHP
PHP扩展类型及安装方式解析
Apr 27 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
eaglephp使用微信api接口开发微信框架
2014/01/09 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
smarty内置函数section的用法
2015/01/22 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
2014/12/16 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
第六章之辅组类与响应式工具
2016/04/25 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python程序设计入门(2)变量类型简介
2014/06/16 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
HTML5实现WebSocket协议原理浅析
2014/07/07 HTML / CSS
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
长曲棍球装备:Lacrosse Monkey
2020/12/02 全球购物
中专生职业生涯规划书范文
2014/01/10 职场文书
学生安全教育材料
2014/02/14 职场文书
安全生产实施方案
2014/02/23 职场文书
节能环保演讲稿
2014/08/28 职场文书
北京青年观后感
2015/06/15 职场文书
中学生打架《检讨书》范文
2019/08/12 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript