婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺談PHP設計模式之對象池模式Pool

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

熱門標簽:福州人工外呼系統哪家強 常州地圖標注服務商 地圖標注平臺怎么給錢注冊 衡水外呼系統平臺 注冊400電話申請 安裝電銷外呼系統 百度商鋪地圖標注 新河科技智能外呼系統怎么樣 釘釘打卡地圖標注

目的

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

無論如何,對象池模式在需要耗時創建對象方面,例如創建數據庫連接,套接字連接,線程和大型圖形對象(比方字體或位圖等),使用起來都是大有裨益的。在某些情況下,簡單的對象池(無外部資源,只占內存)可能效率不高,甚至會有損性能。

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的詳細內容,更多關于PHP設計模式之對象池模式Pool的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • PHP設計模式(觀察者模式)
  • 淺談PHP設計模式之門面模式Facade
  • 詳解PHP設計模式之依賴注入模式
  • PHP設計模式之迭代器模式的使用
  • 詳解PHP八大設計模式
  • PHP設計模式之原型模式示例詳解
  • PHP設計模式之命令模式示例詳解
  • PHP八大設計模式案例詳解

標簽:六安 鷹潭 唐山 鶴崗 遼陽 白城 柳州 克拉瑪依

巨人網絡通訊聲明:本文標題《淺談PHP設計模式之對象池模式Pool》,本文關鍵詞  淺談,PHP,設計模式,之,對象,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談PHP設計模式之對象池模式Pool》相關的同類信息!
  • 本頁收集關于淺談PHP設計模式之對象池模式Pool的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 五台县| 东阳市| 东光县| 日土县| 炎陵县| 仙居县| 巴塘县| 武城县| 北碚区| 特克斯县| 静乐县| 永寿县| 合山市| 芦山县| 若尔盖县| 康定县| 察雅县| 米林县| 平陆县| 九龙县| 喀什市| 塘沽区| 化隆| 正阳县| 安平县| 郑州市| 中山市| 页游| 进贤县| 武山县| 右玉县| 习水县| 江安县| 五家渠市| 尖扎县| 手游| 濮阳市| 新丰县| 长沙县| 凌源市| 沅陵县|