php设计模式之享元模式分析【星际争霸游戏案例】


Posted in PHP onMarch 23, 2020

本文实例讲述了php设计模式之享元模式。分享给大家供大家参考,具体如下:

星际的战斗达到后面,地图里面的部队很多,如果我们把每个兵的图像动画和属性值作为一个对象的话,系统的内存里会消耗极大。

我们在玩的时候会发现,因为星际里面的种族只有三个,其实兵种只有几十个。
虽然每个独立的士兵剩余的血不同,但是同一兵种的图像动画是一样的,即使不同的玩家,只是不同的颜色。比如每个人族的机枪兵。

而且大多数玩家只用到常用的一些兵种,很多时候不会制造所有的兵种。

待解决的问题:把把兵种的图像动画共享。

思路:我们把每个兵种的图像动画建模作为对象,放入内存共享。一旦有某个画面用到这个兵种,只要把共享的图像动画拿出来,更改颜色就可以了。

享元(Flyweight)模式示例:

<?php
 //机枪兵享元
 class MarineFlyweight
 {
  //绘制机枪兵的图像动画,参数为状态,比如属于哪一个玩家
  public function drawMarine($state)
  {
   //绘制机枪兵
  }
 }

 //享元工厂
 class FlyweightFactory
 {
  //享元数组,用于存放多个享元
  private $flyweights;

  //获取享元的方法
  public function getFlyweight($name)
  {
   if (!isset($flyweights[$name]))
   {
    $flyweights[$name] = new $name."Flyweight";
   }
   return $flyweights[$name];
  }
 }

 //初始化享元工厂
 $flyweightFactory = new FlyweightFactory();

 //当我们需要绘制一个机枪兵的时候,同时传递一个状态数组,里面包含剩余的血等等
 $marine = $flyweightFactory->getFlyweight("Marine");
 $marine->drawMarine($status);
?>

用途总结:享元模式可以将需要共享的资源集中起来,统一管理,防止重复消耗。

实现总结:需要一个享元工厂管理共享的资源,比如上面的FlyweightFactory。把所有共享的资源的生产全部交给个享元工厂。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php.ini中文版
Oct 09 PHP
php代码把全角数字转为半角数字
Dec 10 PHP
php部分常见问题总结
Mar 27 PHP
php下HTTP Response中的Chunked编码实现方法
Nov 19 PHP
PHP simple_html_dom.php+正则 采集文章代码
Dec 24 PHP
ajax+php打造进度条 readyState各状态
Mar 20 PHP
PHP网站备份程序代码分享
Jun 10 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
Jun 21 PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
Nov 16 PHP
php使用 readfile() 函数设置文件大小大小的方法
Aug 11 PHP
php workerman定时任务的实现代码
Dec 23 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 #PHP
PDO实现学生管理系统
Mar 21 #PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 #PHP
YII2框架使用控制台命令的方法分析
Mar 18 #PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 #PHP
YII2框架中日志的配置与使用方法实例分析
Mar 18 #PHP
YII2框架中查询生成器Query()的使用方法示例
Mar 18 #PHP
You might like
用PHP控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
PHP 变量类型的强制转换
2009/10/23 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
Ajax 数据请求的简单分析
2011/04/05 Javascript
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
JS获取时间的方法
2015/01/21 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
JS中的作用域链
2017/03/01 Javascript
javaScript手机号码校验工具类PhoneUtils详解
2017/12/08 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
layui lay-verify form表单自定义验证规则详解
2019/09/18 Javascript
python3 shelve模块的详解
2017/07/08 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
2020/05/07 Python
python dict乱码如何解决
2020/06/07 Python
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
课堂教学改革实施方案
2014/03/17 职场文书
初中升旗仪式演讲稿
2014/05/08 职场文书
2014年英语教学工作总结
2014/12/17 职场文书
预备党员转正材料
2014/12/19 职场文书
校本课程教学计划
2015/01/19 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
2016高中社会实践心得体会范文
2016/01/14 职场文书
2016年社区党支部公开承诺书
2016/03/25 职场文书
Redis如何一键部署脚本
2021/04/12 Redis
SQL Server 中的事务介绍
2022/05/20 SQL Server