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 相关文章推荐
回答PHPCHINA上的几个问题:URL映射
Feb 14 PHP
使用 MySQL Date/Time 类型
Mar 26 PHP
Apache下禁止php文件被直接访问的解决方案
Apr 25 PHP
一个简单的php加密解密函数(动态加密)
Jun 19 PHP
计算php页面运行时间的函数介绍
Jul 01 PHP
php mysql_real_escape_string函数用法与实例教程
Sep 30 PHP
PHP中Session引起的脚本阻塞问题解决办法
Apr 08 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
Nov 25 PHP
php的GD库imagettftext函数解决中文乱码问题
Jan 24 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
Apr 20 PHP
php socket通信简单实现
Nov 18 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 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语言构造器介绍
2013/07/08 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
Javascript setInterval的两种调用方法(实例讲解)
2013/11/29 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
python中文编码问题小结
2014/09/28 Python
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
Python操作Word批量生成文章的方法
2015/07/28 Python
Python实现字典依据value排序
2016/02/24 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
Django 内置权限扩展案例详解
2019/03/04 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
html5使用canvas画一条线
2014/12/15 HTML / CSS
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
公证处委托书
2015/01/28 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
夫妻吵架保证书
2015/05/08 职场文书
python munch库的使用解析
2021/05/25 Python
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android
Python实现老照片修复之上色小技巧
2021/10/16 Python