1. 程式人生 > 程式設計 >淺談PHP設計模式之物件池模式Pool

淺談PHP設計模式之物件池模式Pool

目的

在初始化例項成本高,例項化率高,可用例項不足的情況下,物件池可以極大地提升效能。在建立物件(尤其是通過網路)時間花銷不確定的情況下,通過物件池在可期時間內就可以獲得所需的物件。

無論如何,物件池模式在需要耗時建立物件方面,例如建立資料庫連線,套接字連線,執行緒和大型圖形物件(比方字型或點陣圖等),使用起來都是大有裨益的。在某些情況下,簡單的物件池(無外部資源,只佔記憶體)可能效率不高,甚至會有損效能。

UML 類圖

淺談PHP設計模式之物件池模式Pool

程式碼

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.com
n 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.com
orkerPool(); $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的資料請關注我們其它相關文章!