淺談PHP設計模式之物件池模式Pool
阿新 • • 發佈:2021-05-27
目的
在初始化例項成本高,例項化率高,可用例項不足的情況下,物件池可以極大地提升效能。在建立物件(尤其是通過網路)時間花銷不確定的情況下,通過物件池在可期時間內就可以獲得所需的物件。
無論如何,物件池模式在需要耗時建立物件方面,例如建立資料庫連線,套接字連線,執行緒和大型圖形物件(比方字型或點陣圖等),使用起來都是大有裨益的。在某些情況下,簡單的物件池(無外部資源,只佔記憶體)可能效率不高,甚至會有損效能。
UML 類圖
程式碼
WorkerPool.php
<?php namespace DesignPatterns\Creational\Pool; class WorkerPool implements \Countable { /** * @var StringReverseWorker[] */ private $occupiedWorkers = []; /** * @var StringReverseWorker[] */ private $freeWorkers = []; public function get(): StringReverseWorker { if (count($this->freeWorkers) == 0) { $worker = new StringReverseWorker(); } else { $worker = array_pop($this->freeWorkers); } $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->freeWorkers[$key] = $worker; } } public functiohttp://www.cppcns.comn count(): int { return count($this->occupiedWorkers) + count($this->freeWorkers); } }
StringReverseWorker.php
<?php namespace DesignPatterns\CreationalhbpJWyewPool; class StringReverseWorker { /** * @var \DateTime */ private $createdAt; public function __construct() { $this->createdAt = new \DateTime(); } public function run(string $text) { return strrev($text); } }
測試
Tests/PoolTest.php
<?php namespace DesignPatterns\Creational\Pool\Tests; use DesignPatterns\Creational\Pool\WorkerPool; use PHPUnit\Framework\TestCase; class PoolTest extends TestCase { public function testCanGetNewInstancesWithGe程式設計客棧t() { $pool = new Whttp://www.cppcns.comorkerPool(); $worker1 = $pohbpJWyewol->get(); $worker2 = $pool->get(); $this->assertCount(2,$pool); $this->assertNotSame($worker1,$worker2); } public function testCanGetSameInstanceTwiceWhenDisposingItFirst() { $pool = new WorkerPool(); $worker1 = $pool->get(); $pool->dispose($worker1); $worker2 = $pool->get(); $this->assertCount(1,$pool); $this->assertSame($worker1,$worker2); } }
以上就是淺談PHP設計模式之物件池模式Pool的詳細內容,更多關於PHP設計模式之物件池模式Pool的資料請關注我們其它相關文章!