当前位置:首页 > PHP教程 > php高级应用 > 列表

浅谈PHP设计模式之对象池模式Pool

发布:smiling 来源: PHP粉丝网  添加日期:2022-04-27 14:51:08 浏览: 评论:0 

对象池模式是一种提前准备了一组已经初始化了的对象『池』而不是按需创建或者销毁的创建型设计模式。对象池客户端会向对象池中请求一个对象,然后使用这个返回的对象执行相关操作。当客户端使用完毕,它将把这个特定类型的工厂对象返回给对象池,而不是销毁掉这个对象。

目的

在初始化实例成本高,实例化率高,可用实例不足的情况下,对象池可以极大地提升性能。在创建对象(尤其是通过网络)时间花销不确定的情况下,通过对象池在可期时间内就可以获得所需的对象。

无论如何,对象池模式在需要耗时创建对象方面,例如创建数据库连接,套接字连接,线程和大型图形对象(比方字体或位图等),使用起来都是大有裨益的。在某些情况下,简单的对象池(无外部资源,只占内存)可能效率不高,甚至会有损性能。

UML 类图

浅谈PHP设计模式之对象池模式Pool

代码

WorkerPool.php

  1. <?php 
  2.  
  3. namespace DesignPatterns\Creational\Pool; 
  4.  
  5. class WorkerPool implements \Countable 
  6.     /** 
  7.     * @var StringReverseWorker[] 
  8.     */ 
  9.     private $occupiedWorkers = []; 
  10.  
  11.     /** 
  12.     * @var StringReverseWorker[] 
  13.     */ 
  14.     private $freeWorkers = []; 
  15.  
  16.     public function get(): StringReverseWorker 
  17.     { 
  18.         if (count($this->freeWorkers) == 0) { 
  19.             $worker = new StringReverseWorker(); 
  20.         } else { 
  21.             $worker = array_pop($this->freeWorkers); 
  22.         } 
  23.  
  24.         $this->occupiedWorkers[spl_object_hash($worker)] = $worker
  25.  
  26.         return $worker
  27.     } 
  28.  
  29.     public function dispose(StringReverseWorker $worker
  30.     { 
  31.         $key = spl_object_hash($worker); 
  32.  
  33.         if (isset($this->occupiedWorkers[$key])) { 
  34.             unset($this->occupiedWorkers[$key]); 
  35.             $this->freeWorkers[$key] = $worker
  36.         } 
  37.     } 
  38.  
  39.     public function count(): int 
  40.     { 
  41.         return count($this->occupiedWorkers) + count($this->freeWorkers); 
  42.     } 

StringReverseWorker.php

  1. <?php 
  2.  
  3. namespace DesignPatterns\Creational\Pool; 
  4.  
  5. class StringReverseWorker 
  6.     /** 
  7.     * @var \DateTime 
  8.     */ 
  9.     private $createdAt
  10.  
  11.     public function __construct() 
  12.     { 
  13.         $this->createdAt = new \DateTime(); 
  14.     } 
  15.  
  16.     public function run(string $text
  17.     { 
  18.         return strrev($text); 
  19.     } 

测试

Tests/PoolTest.php

  1. <?php 
  2.  
  3. namespace DesignPatterns\Creational\Pool\Tests; 
  4.  
  5. use DesignPatterns\Creational\Pool\WorkerPool; 
  6. use PHPUnit\Framework\TestCase; 
  7.  
  8. class PoolTest extends TestCase 
  9.     public function testCanGetNewInstancesWithGet() 
  10.     { 
  11.         $pool = new WorkerPool(); 
  12.         $worker1 = $pool->get(); 
  13.         $worker2 = $pool->get(); 
  14.  
  15.         $this->assertCount(2, $pool); 
  16.         $this->assertNotSame($worker1$worker2); 
  17.     } 
  18.  
  19.     public function testCanGetSameInstanceTwiceWhenDisposingItFirst() 
  20.     { 
  21.         $pool = new WorkerPool(); 
  22.         $worker1 = $pool->get(); 
  23.         $pool->dispose($worker1); 
  24.         $worker2 = $pool->get(); 
  25.  
  26.         $this->assertCount(1, $pool); 
  27.         $this->assertSame($worker1$worker2); 
  28.     } 
  29. }

Tags: PHP设计模式 PHP对象池模式

分享到: