婷婷综合国产,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的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 大荔县| 淮安市| 蒲城县| 图们市| 射阳县| 高要市| 且末县| 舟曲县| 孟村| 永吉县| 乌恰县| 连云港市| 仁寿县| 武汉市| 共和县| 濮阳市| 同心县| 新疆| 盐城市| 廊坊市| 宝应县| 河池市| 余姚市| 新昌县| 天水市| 舒兰市| 电白县| 山东省| 新安县| 京山县| 济南市| 咸宁市| 宜州市| 珲春市| 武冈市| 海口市| 丰宁| 平果县| 栾川县| 永吉县| 平阴县|