PHP中对象池模式的目的是什么,如何应用
导读:这篇文章主要给大家介绍“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