首页后端开发PHPPHP中对象池模式的目的是什么,如何应用

PHP中对象池模式的目的是什么,如何应用

时间2024-03-24 18:14:03发布访客分类PHP浏览1014
导读:这篇文章主要给大家介绍“PHP中对象池模式的目的是什么,如何应用”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“PHP中对象池模式的目的是什么,如何应用”文章能对大家有所帮...
这篇文章主要给大家介绍“PHP中对象池模式的目的是什么,如何应用”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“PHP中对象池模式的目的是什么,如何应用”文章能对大家有所帮助。
 

目的

在初始化实例成本高,实例化率高,可用实例不足的情况下,对象池可以极大地提升性能。在创建对象(尤其是通过网络)时间花销不确定的情况下,通过对象池在可期时间内就可以获得所需的对象。

无论如何,对象池模式在需要耗时创建对象方面,例如创建数据库连接,套接字连接,线程和大型图形对象(比方字体或位图等),使用起来都是大有裨益的。在某些情况下,简单的对象池(无外部资源,只占内存)可能效率不高,甚至会有损性能。

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中对象池模式的目的是什么,如何应用”的内容了,通过以上内容的阐述,相信大家对PHP中对象池模式的目的是什么,如何应用已经有了进一步的了解,如果想要了解更多相关的内容,欢迎关注网络,网络将为大家推送更多相关知识点的文章。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: PHP中对象池模式的目的是什么,如何应用
本文地址: https://pptw.com/jishu/652232.html
java文件操作如何学习,输入输出结构是怎样的 Spring中的Bean是什么,Bean标签如何学习

游客 回复需填写必要信息