最新国产好看的视频,伊人天堂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的資料請關注腳本之家其它相關文章!

相關文章

最新評論

嫩江县| 柳州市| 尚义县| 天等县| 兴安县| 巴里| 镇平县| 辽中县| 二连浩特市| 广灵县| 晋州市| 阿拉善左旗| 溆浦县| 呼图壁县| 兴化市| 鄂托克前旗| 八宿县| 化德县| 石泉县| 潢川县| 旅游| 利川市| 秭归县| 苏州市| 华坪县| 浦县| 长兴县| 石嘴山市| 富川| 汉源县| 南部县| 自贡市| 横山县| 长岭县| 积石山| 那曲县| 浦北县| 寿宁县| 温州市| 宁津县| 大英县|