对象池
<ul>
<li>用来管理对象缓存。</li>
<li>对象池是一组已经初始化过且可以直接使用的对象集合,需要使用对象时不是直接new,而是从对象池中取出,如果对象池中没有空闲对象,则新建一个空闲对象,并在不需要时重新放进对象池而非销毁。</li>
<li>如果对象实例化的代价高且经常需要实例化,但每次实例化的数量较少的情况下,使用对象池可以获得显著的性能提升。</li>
<li>对象池技术的使用非常广泛,例如线程池、数据库连接池、任务队列池、图片资源对象池等。</li>
</ul>
<h2>代码示例</h2>
<pre><code class="language-PHP"><?php
/**
* 字符串反向工作者
*/
class StringReverseWorker
{
public function __construct()
{
}
public function run($text)
{
return strrev($text);
}
}
/**
* 工作池
*/
class WorkerPool implements Countable
{
/**
* @var StringReverseWorker[]
*/
private $occupiedWorkers = [];
/**
* @var StringReverseWorker[]
*/
private $freeWorkers = [];
public function get()
{
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 function count()
{
return count($this->occupiedWorkers) + count($this->freeWorkers);
}
}
$workerPool = new WorkerPool();
$stringReverseWorker1 = $workerPool->get();
$stringReverseWorker1 -> run('test');
$workerPool -> dispose($stringReverseWorker1);
</code></pre>