主页 > 知识库 > 浅谈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的相关信息资讯供网民参考!
  • 推荐文章