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 Header用于页面跳转要注意的几个问题总结
Oct 03 PHP
php smarty 二级分类代码和模版循环例子
Jun 01 PHP
一些php项目中比较通用的php自建函数的详解
Jun 06 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
php 邮件发送问题解决
Mar 22 PHP
php使用codebase生成随机数
Mar 25 PHP
php获取系统变量方法小结
May 29 PHP
PHP合并数组+号和array_merge的区别
Jun 25 PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 PHP
PHP实现清除wordpress里恶意代码
Oct 21 PHP
PHP创建/删除/复制文件夹、文件
May 03 PHP
实例讲解PHP中使用命名空间
Jan 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
收音机指标测试方法及仪器
2021/03/01 无线电
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
php curl发送请求实例方法
2019/08/01 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
JavaScript 特殊字符
2007/04/05 Javascript
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
2015/11/17 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
微信小程序使用template标签实现五星评分功能
2018/11/03 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
2019/01/27 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
Python设置Socket代理及实现远程摄像头控制的例子
2015/11/13 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
任意存:BOXFUL
2018/05/21 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
《李广射虎》教学反思
2014/04/27 职场文书
上班迟到检讨书
2014/09/15 职场文书
大明湖导游词
2015/02/03 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript
MySQL系列之二 多实例配置
2021/07/02 MySQL