淺談PHP設計模式之對象池模式Pool
目的
在初始化實例成本高,實例化率高,可用實例不足的情況下,對象池可以極大地提升性能。在創(chuàng)建對象(尤其是通過網(wǎng)絡)時間花銷不確定的情況下,通過對象池在可期時間內(nèi)就可以獲得所需的對象。
無論如何,對象池模式在需要耗時創(chuàng)建對象方面,例如創(chuàng)建數(shù)據(jù)庫連接,套接字連接,線程和大型圖形對象(比方字體或位圖等),使用起來都是大有裨益的。在某些情況下,簡單的對象池(無外部資源,只占內(nèi)存)可能效率不高,甚至會有損性能。
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 function count(): int
{
return count($this->occupiedWorkers) + count($this->freeWorkers);
}
}
StringReverseWorker.php
<?php
namespace DesignPatterns\Creational\Pool;
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 testCanGetNewInstancesWithGet()
{
$pool = new WorkerPool();
$worker1 = $pool->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的詳細內(nèi)容,更多關于PHP設計模式之對象池模式Pool的資料請關注腳本之家其它相關文章!
相關文章
php通過Chianz.com獲取IP地址與地區(qū)的方法
這篇文章主要介紹了php通過Chianz.com獲取IP地址與地區(qū)的方法,是解析IP地址與地區(qū)非常實用的技巧,需要的朋友可以參考下2015-01-01
php實現(xiàn)壓縮合并js的方法【附demo源碼下載】
這篇文章主要介紹了php實現(xiàn)壓縮合并js的方法,涉及php壓縮文件類JSMin的相關調(diào)用與使用技巧,并附帶了完整的demo源碼供讀者下載參考,需要的朋友可以參考下2016-09-09
PHP中key和current,next的聯(lián)合運用實例分析
這篇文章主要介紹了PHP中key和current,next的聯(lián)合運用,結合實例形式分析了key和current,next操作數(shù)組元素的相關技巧,需要的朋友可以參考下2016-03-03
PHP 字符串加密函數(shù)(在指定時間內(nèi)加密還原字符串,超時無法還原)
最近, 從discuz里面發(fā)現(xiàn)了一個很牛的加密解密函數(shù)。此函數(shù)的厲害之處在于可以在指定時間內(nèi)加密還原字符串,超時無法還原.2010-04-04
php eval函數(shù)用法 PHP中eval()函數(shù)小技巧
本函式可將字符串之中的變量值代入,通常用在處理數(shù)據(jù)庫的數(shù)據(jù)上2012-10-10
利用php+mcDropdown實現(xiàn)文件路徑可在下拉框選擇
以下是對php+mcDropdown實現(xiàn)文件路徑可在下拉框進行選擇的方法進行了詳細的分析介紹,需要的朋友可以過來參考下2013-08-08

