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

淺談PHP設(shè)計模式之對象池模式Pool

熱門標簽:科大訊飛語音識別系統(tǒng) 銀行業(yè)務(wù) 團購網(wǎng)站 Linux服務(wù)器 電子圍欄 服務(wù)器配置 阿里云 Mysql連接數(shù)設(shè)置

目的

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

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

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

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

標簽:衡水 衢州 廣元 大理 江蘇 蚌埠 棗莊 萍鄉(xiāng)

巨人網(wǎng)絡(luò)通訊聲明:本文標題《淺談PHP設(shè)計模式之對象池模式Pool》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266