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 危险函数解释 分析
Apr 22 PHP
php5 non-thread-safe和thread-safe这两个版本的区别分析
Mar 13 PHP
深入PHP操作MongoDB的技术总结
Jun 02 PHP
PHP上传文件时文件过大$_FILES为空的解决方法
Nov 26 PHP
php实现文件下载(支持中文文名)
Dec 04 PHP
thinkphp模板输出技巧汇总
Nov 24 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
Mar 18 PHP
smarty模板引擎之内建函数用法
Mar 30 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
Dec 18 PHP
PHP中使用foreach()遍历二维数组的简单实例
Jun 13 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
Oct 08 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 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
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
js调试工具Console命令详解
2014/10/21 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
jQuery基于ID调用指定iframe页面内的方法
2016/07/06 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
Angular实现预加载延迟模块的示例
2017/10/12 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
vue favicon设置以及动态修改favicon的方法
2018/12/21 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
python3编码问题汇总
2016/09/06 Python
Python实现的手机号归属地相关信息查询功能示例
2017/06/08 Python
Python中的Numpy矩阵操作
2018/08/12 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
简单了解python数组的基本操作
2019/11/26 Python
python db类用法说明
2020/07/07 Python
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
小学教师师德演讲稿
2014/05/06 职场文书
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
召开会议通知范文
2015/04/15 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
python简单验证码识别的实现过程
2021/06/20 Python