淺談PHP設(shè)計模式之對象池模式Pool
目的
在初始化實例成本高,實例化率高,可用實例不足的情況下,對象池可以極大地提升性能。在創(chuàng)建對象(尤其是通過網(wǎng)絡(luò))時間花銷不確定的情況下,通過對象池在可期時間內(nèi)就可以獲得所需的對象。
無論如何,對象池模式在需要耗時創(chuàng)建對象方面,例如創(chuàng)建數(shù)據(jù)庫連接,套接字連接,線程和大型圖形對象(比方字體或位圖等),使用起來都是大有裨益的。在某些情況下,簡單的對象池(無外部資源,只占內(nèi)存)可能效率不高,甚至?xí)袚p性能。
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設(shè)計模式之對象池模式Pool的詳細內(nèi)容,更多關(guān)于PHP設(shè)計模式之對象池模式Pool的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解析php中var_dump,var_export,print_r三個函數(shù)的區(qū)別
本篇文章是對php中var_dump,var_export,print_r三個函數(shù)的區(qū)別進行了詳細的分析介紹,需要的朋友參考下2013-06-06php實現(xiàn)與python進行socket通信的方法示例
這篇文章主要介紹了php實現(xiàn)與python進行socket通信的方法,結(jié)合實例形式分析了php使用自定義類發(fā)送socket請求數(shù)據(jù)及Python接收socket數(shù)據(jù)并處理請求等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08詳解PHP執(zhí)行定時任務(wù)的實現(xiàn)思路
這篇文章主要介紹了詳解PHP執(zhí)行定時任務(wù)的幾種實現(xiàn)思路,PHP的定時任務(wù)功能必須通過和其他工具結(jié)合才能實現(xiàn),們就來深入的解析幾種常見的php定時任務(wù)的思路2015-12-12