加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_郴州站长网 (http://www.0735zz.com/)- 云通信、区块链、物联设备、云计算、站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

一文认识PHP中的享元模式

发布时间:2022-07-12 13:04:17 所属栏目:PHP教程 来源:互联网
导读:享元模式,享元这两个字在中文里其实并没有什么特殊的意思,所以我们要把它拆分来看。享就是共享,元就是元素,这样一来似乎就很容易理解了,共享某些元素嘛。 Gof类图及解释 GoF定义:运用共享技术有效地支持大量细粒度的对象 GoF类图 1.jpg 代码实现 inter
  享元模式,“享元”这两个字在中文里其实并没有什么特殊的意思,所以我们要把它拆分来看。“享”就是共享,“元”就是元素,这样一来似乎就很容易理解了,共享某些元素嘛。
 
  Gof类图及解释
  GoF定义:运用共享技术有效地支持大量细粒度的对象
 
  GoF类图
 
  1.jpg
 
  代码实现
 
  
  interface Flyweight
 
  {
 
      public function operation($extrinsicState) : void;
 
  }
 
   
 
  class ConcreteFlyweight implements Flyweight
 
  {
 
      private $intrinsicState = 101;
 
      function operation($extrinsicState) : void
 
      {
 
          echo '共享享元对象' . ($extrinsicState + $this->intrinsicState) . PHP_EOL;
 
      }
 
  }
 
   
 
  class UnsharedConcreteFlyweight implements Flyweight
 
  {
 
      private $allState = 1000;
 
      public function operation($extrinsicState) : void
 
      {
 
          echo '非共享享元对象:' . ($extrinsicState + $this->allState) . PHP_EOL;
 
      }
 
  }
 
  定义共享接口以及它的实现,注意这里有两个实现,ConcreteFlyweigh进行状态的共享,UnsharedConcreteFlyweight不共享或者说他的状态不需要去共享
 
  
 
 
  class FlyweightFactory
 
  {
 
      private $flyweights = [];
 
   
 
      public function getFlyweight($key) : Flyweight
 
      {
 
          if (!array_key_exists($key, $this->flyweights)) {
 
              $this->flyweights[$key] = new ConcreteFlyweight();
 
          }
 
          return $this->flyweights[$key];
 
      }
 
  }
 
  保存那些需要共享的对象,做为一个工厂来创建需要的共享对象,保证相同的键值下只会有唯一的对象,节省相同对象创建的开销
  
 
  $factory = new FlyweightFactory();
 
   
 
  $extrinsicState = 100;
 
  $flA = $factory->getFlyweight('a');
 
  $flA->operation(--$extrinsicState);
 
   
 
  $flB = $factory->getFlyweight('b');
 
  $flB->operation(--$extrinsicState);
 
   
 
  $flC = $factory->getFlyweight('c');
 
  $flC->operation(--$extrinsicState);
 
   
 
  $flD = new UnsharedConcreteFlyweight();
 
  $flD->operation(--$extrinsicState);
 
  客户端的调用,让外部状态$extrinsicState能够在各个对象之间共享
 
  有点意思吧,这个模式的代码量可不算少
  当一个应用程序使用了大量非常相似的的对象,对象的大多数状都可变为外部状态时,很适合享元模式
  这里的工厂是存储对象列表的,不是像工厂方法或者抽象工厂一样去创建对象的,虽说这里也进行了创建,但如果对象存在,则会直接返回,而且列表也是一直维护的
  享元模式在现实中,大家多少一定用过,各种池技术就是它的典型应用:线程池、连接池等等,另外两个一样的字符串String类型在php或Java中都是可以===的,这也运用到了享元模式,它们连内存地址都是一样的,这不就是一种共享嘛
  关于享元模式,有一个极其经典的例子,比我下面的例子要好的多,那就是关于围棋的棋盘。围棋只有黑白两色,所以两个对象就够了,接下来呢?改变他们的位置状态就好啦!有兴趣的朋友可以搜搜哈!
  Laravel中的IoC容器可以看作是一种享元模式的实现。它把对象保存在数组中,在需要的时候通过闭包机制进行取用,也有一些类有共享一些状态属性的内容。大家可以翻看代码了解了解。
  还是说到科技以换壳为本这件事上。毕竟,大家都还是喜欢各种颜色的手机来彰显自己的个性。之前说过,如果每种颜色我们都要做一条生产线的话那岂不是一项巨大的投入。还好,每个型号我们的工厂(享元工厂)只生产最基本的背景壳(对象),然后通过专门的印刷线(状态变化)来进行上色不就好啦!嗯,下一款Iphone早晚也会模仿我们的,看来我们得先把各种金、各种土豪色集齐才行,说不定还能召唤神龙呢!!

(编辑:开发网_郴州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读