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仿ZOL分页类代码
Oct 02 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
Aug 14 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
Jun 24 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
php session劫持和防范的方法
Nov 12 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
Nov 19 PHP
PHP实现动态柱状图改进版
Mar 30 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
Oct 08 PHP
php实现跨域提交form表单的方法【2种方法】
Oct 17 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
Mar 06 PHP
PHP工厂模式的日常使用
Mar 20 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
May 29 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往windows中添加用户
2006/12/06 PHP
PHP日期处理函数 整型日期格式
2011/01/12 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
php中rename函数用法分析
2014/11/15 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
用box固定长宽实现图片自动轮播js代码
2014/06/09 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
javascript实现全角与半角字符的转换
2015/01/07 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
简单实现jQuery轮播效果
2017/08/18 jQuery
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
vue内置组件component--通过is属性动态渲染组件操作
2020/07/28 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
培训主管的岗位职责
2013/11/23 职场文书
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python