设计模式 - 创造 - 对象池模式
对象池模式
对象池的客户端会向对象池中请求一个对象,然后使用这个返回的对象执行相关操作。当客户端使用完毕,它将把这个特定类型的工厂对象返回给对象池,而不是销毁掉这个对象。
// 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 协议》,转载必须注明作者和本文链接