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初学者头痛的十四个问题
Jul 12 PHP
PHP与SQL注入攻击[一]
Apr 17 PHP
两个开源的Php输出Excel文件类
Feb 08 PHP
用PHP ob_start()控制浏览器cache、生成html实现代码
Feb 16 PHP
用PHP实现递归循环每一个目录
Aug 08 PHP
php中如何防止表单的重复提交
Aug 02 PHP
PHP SPL使用方法和他的威力
Nov 12 PHP
php生成随机密码自定义函数代码(简单快速)
May 10 PHP
PHP两种去掉数组重复值的方法比较
Jun 19 PHP
PHP异常处理Exception类
Dec 11 PHP
php使用glob函数遍历文件和目录详解
Sep 23 PHP
php多进程模拟并发事务产生的问题小结
Dec 07 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中array_map和array_walk的使用对比
2016/11/20 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
JavaScript入门学习书籍推荐
2008/06/12 Javascript
jQuery select的操作实现代码
2009/05/06 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
JS自定义选项卡函数及用法实例分析
2015/09/02 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
2017/06/08 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
[04:56]经典回顾:前Ehome 与 前LGD
2015/02/26 DOTA
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
wxPython中listbox用法实例详解
2015/06/01 Python
深入解析Python中的变量和赋值运算符
2015/10/12 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
求职简历自荐信范文
2013/10/21 职场文书
四风问题对照检查材料
2014/09/22 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
护士医德考评自我评价
2015/03/03 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
电力培训学习心得体会
2016/01/11 职场文书
筑梦中国心得体会
2016/01/18 职场文书
iPhone13 Pro外观确定,升级4800万镜头,4月20日发新品
2021/04/15 数码科技
Golang: 内建容器的用法
2021/05/05 Golang
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python