最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談PHP設計模式之對象池模式Pool

 更新時間:2021年05月26日 08:57:09   作者:phpyu  
對象池模式是一種提前準備了一組已經(jīng)初始化了的對象『池』而不是按需創(chuàng)建或者銷毀的創(chuàng)建型設計模式。對象池客戶端會向對象池中請求一個對象,然后使用這個返回的對象執(zhí)行相關操作。當客戶端使用完畢,它將把這個特定類型的工廠對象返回給對象池,而不是銷毀掉這個對象。

目的

在初始化實例成本高,實例化率高,可用實例不足的情況下,對象池可以極大地提升性能。在創(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的資料請關注腳本之家其它相關文章!

相關文章

最新評論

左云县| 大城县| 泸定县| 玉溪市| 泸定县| 沙雅县| 慈利县| 新平| 淅川县| 黎城县| 柳林县| 太原市| 遂宁市| 丹凤县| 乌兰浩特市| 汉中市| 竹溪县| 治县。| 沂南县| 方正县| 江油市| 宝坻区| 敦化市| 前郭尔| 安化县| 临西县| 渭南市| 泽州县| 建平县| 大庆市| 徐州市| 广德县| 临沂市| 阜阳市| 涡阳县| 七台河市| 大荔县| 普宁市| 东乡| 汽车| 曲靖市|