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文件去掉PHP注释空格的函数分析(PHP代码压缩)
Jul 02 PHP
php中如何防止表单的重复提交
Aug 02 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
Jun 04 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
php实现连接access数据库并转txt写入的方法
Feb 08 PHP
php面向对象之反射功能与用法分析
Mar 29 PHP
php及codeigniter使用session-cookie的方法(详解)
Apr 06 PHP
PHP实现权限管理功能示例
Sep 22 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 PHP
PHP 99乘法表的几种实现代码
Oct 13 PHP
使用php的mail()函数实现发送邮件功能
Jun 03 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
js版本A*寻路算法
2006/12/22 Javascript
Javascript的一种模块模式
2008/03/22 Javascript
jquery tab标签页的制作
2010/05/10 Javascript
某人初学javascript的时候写的学习笔记
2010/12/30 Javascript
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
兼容主流浏览器的JS复制内容到剪贴板
2014/12/12 Javascript
javascript实现点击单选按钮链接转向对应网址的方法
2015/08/12 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
nodejs基础之常用工具模块util用法分析
2018/12/26 NodeJs
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
使用jQuery如何写一个含验证码的登录界面
2019/05/13 jQuery
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
python实现汉诺塔方法汇总
2016/07/25 Python
Python线程指南详细介绍
2017/01/05 Python
对Python中的@classmethod用法详解
2018/04/21 Python
使用python 打开文件并做匹配处理的实例
2019/01/02 Python
Python3爬虫中关于中文分词的详解
2020/07/29 Python
Python random模块的使用示例
2020/10/10 Python
python实现企业微信定时发送文本消息的实例代码
2020/11/25 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
专门经营化妆刷的美国彩妆品牌:Sigma Beauty
2017/09/11 全球购物
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
行政经理的岗位职责
2013/11/23 职场文书
党员干部承诺书
2014/03/25 职场文书
文明演讲稿范文
2014/05/12 职场文书
详解Redis主从复制实践
2021/05/19 Redis
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis