php专区

 首页 > php专区 > PHP应用 > 常用功能 > php Flyweight享元模式使用例子 - php高级应用

php Flyweight享元模式使用例子 - php高级应用

分享到:
【字体:
导读:
          星际的战斗达到后面,地图里面的部队很多,如果我们把每个兵的图像动画和属性值作为一个对象的话,系统的内存里会消耗极大 我们在玩的时候会发现,因为星际里面的种族只有三个,其实...

php Flyweight享元模式使用例子

星际的战斗达到后面,地图里面的部队很多,如果我们把每个兵的图像动画和属性值作为一个对象的话,系统的内存里会消耗极大.我们在玩的时候会发现,因为星际里面的种族只有三个,其实兵种只有几十个.

虽然每个独立的士兵剩余的血不同,但是同一兵种的图像动画是一样的,即使不同的玩家,只是不同的颜色,比如每个人族的机枪兵.而且大多数玩家只用到常用的一些兵种,很多时候不会制造所有的兵种.

待解决的问题:把把兵种的图像动画共享.

思路:我们把每个兵种的图像动画建模作为对象,放入内存共享,一旦有某个画面用到这个兵种,只要把共享的图像动画拿出来,更改颜色就可以了.

享元(Flyweight)模式示例,代码如下:

  1.  
  2. //机枪兵享元 
  3.  
  4. class MarineFlyweight 
  5.  
  6.  
  7.   //绘制机枪兵的图像动画,参数为状态,比如属于哪一个玩家 
  8.  
  9.   public function drawMarine($state
  10.  
  11.   { 
  12.  
  13.   //绘制机枪兵 
  14.  
  15.   } 
  16.  
  17.  
  18. //享元工厂 
  19.  
  20. class FlyweightFactory 
  21.  
  22.  
  23.   //享元数组,用于存放多个享元 
  24.  
  25.   private $flyweights
  26.  
  27.   //获取享元的方法 
  28.  
  29.   public function getFlyweight($name
  30.  
  31.   { 
  32.  
  33.     if (!isset($flyweights[$name])) 
  34.  
  35.     { 
  36.  
  37.       $flyweights[$name] = new $name."Flyweight"
  38.  
  39.     } 
  40.  
  41.     return $flyweights[$name]; 
  42.  
  43.   } 
  44.  
  45.  
  46. //初始化享元工厂 
  47.  
  48. $flyweightFactory = new FlyweightFactory(); 
  49.  
  50. //当我们需要绘制一个机枪兵的时候,同时传递一个状态数组,里面包含剩余的血等等 
  51.  
  52. $marine = $flyweightFactory->getFlyweight("Marine"); 
  53.  
  54. $marine->drawMarine($status); 
  55.  
  56. ?> 

用途总结:享元模式可以将需要共享的资源集中起来,统一管理,防止重复消耗.

实现总结:需要一个享元工厂管理共享的资源,比如上面的FlyweightFactory,把所有共享的资源的生产全部交给个享元工厂.

分享到:
PHP 自动引入一个目录的所有 PHP 文件 - ...
PHP 自动引入一个目录的所有 PHP 文件 我爱水煮鱼有个微信插件,会时不时的退出一些插件的 “插件”,直接下载一个提供的 PHP 文件,上传到插件一个指定的目录即可,插件会自动检测、引入并执行这个文件,研究了下,也想弄一个类似的功能,代码如下: /*   *引入一个目录的所有文件   *...
PHP连接Memcache程序代码 - php高级应用
PHP连接Memcache程序代码 Memcache是php中常用到的一个高性能的分布式的内存对象缓存系统,我们可以利用它来对网站进行性能提高并且减少服务器负载,下面是我的学习笔记本大家一起看看,最简单的连接方法. 例子代码如下:   应用中会做一个类,代码如下: class MCache  {  ...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……