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 base64+gzinflate压缩编码和解码代码
Oct 03 PHP
用PHP读取flv文件的播放时间长度
Sep 03 PHP
PHP求最大子序列和的算法实现
Jun 24 PHP
PHP读取xml方法介绍
Jan 12 PHP
php自定义的格式化时间示例代码
Dec 05 PHP
php删除左端与右端空格的方法
Nov 29 PHP
php基于Snoopy解析网页html的方法
Jul 09 PHP
php文件上传你必须知道的几点
Oct 20 PHP
修改Laravel5.3中的路由文件与路径
Aug 10 PHP
php根据数据id自动生成编号的实现方法
Oct 16 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
Mar 11 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图片上传类带图片显示
2006/11/25 PHP
一些使用频率比较高的php函数
2008/10/03 PHP
PHP数组函数知识汇总
2016/05/12 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
jquery模拟按下回车实现代码
2011/09/20 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
JavaScript 学习笔记之操作符
2015/01/14 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
vue实现购物车案例
2020/05/30 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
便捷提取python导入包的属性方法
2018/10/15 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
python打开文件的方式有哪些
2020/06/29 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
师生聚会感言
2014/01/26 职场文书
校长先进事迹材料
2014/02/01 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
令人印象深刻的自荐信
2014/05/25 职场文书
音乐学专业求职信
2014/07/22 职场文书
庆七一主持词
2015/06/29 职场文书
董事长致辞
2015/07/29 职场文书
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers