设计模式 - 创造 - 对象池模式

对象池模式

  • 对象池的客户端会向对象池中请求一个对象,然后使用这个返回的对象执行相关操作。当客户端使用完毕,它将把这个特定类型的工厂对象返回给对象池,而不是销毁掉这个对象。

      // StringReverseWorker.php
      namespace Creational\WorkerPool;
    
      class StringReverseWorker
      {
          public function run():string
          {
              return 'String'; 
          }
      }
    
      // WorkerPool.php
      namespace  Creational\WorkerPool;
    
      use  Countable;
    
      class  WorkerPool  implements  Countable
      {
          private  array  $occupiedWorkers = [];
          private  array  $freeWorks = [];
          public  function  count(): int
          {
              return  count($this->occupiedWorkers) + count($this->freeWorks);
          }
    
           public  function  get()
          {
               if(count($this->freeWorks) == 0){
                  $worker = new  StringReverseWorker();
              }else{
                   $worker = array_pop($this->freeWorks);
    
              }
               $this->occupiedWorkers[spl_object_hash($worker)] = $worker;
              return  $worker;
          }
    
           public  function  dispose(StringReverseWorker  $worker)
          {
               $key = spl_object_hash($worker);
               if(isset($this->occupiedWorkers[$key])){
                   unset($this->occupiedWorkers[$key]);
                   $this->freeWorks[$key] = $worker;
              }
          }
      }
      // WorkerPoolTest.php
      namespace Tests;
    
      use Creational\WorkerPool\WorkerPool;
      use PHPUnit\Framework\TestCase;
    
      class WorkerPoolTest extends TestCase
      {
          public function testWp()
          {
              $pool = new WorkerPool();
              $p1 = $pool->get();
              $p2 = $pool->get();
              //$this->assertEquals($p1, $p2);
              //$this->assertObjectEquals($p1, $p2);
    
              $this->assertCount(2, $pool);
              $this->assertNotSame($p1, $p2);
          }
    
          public function testCanGetSameInstanceTwiceWhenDisposingItFirst()
          {
              $pool = new WorkerPool();
              $worker1 = $pool->get();
              $pool->dispose($worker1);
              $worker2 = $pool->get();
    
              $this->assertCount(1, $pool);
              $this->assertSame($worker1, $worker2);
          }
      }
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!