![706cb79d5ba3543f5880714c8cdc8488.png](https://i-blog.csdnimg.cn/blog_migrate/b39638de49d5a979aada438f642c8618.jpeg)
目的[1]
对象池模式是一种提前准备1个存放 初始化待用对象 “池”的创建型设计模式;而不是一次性创建并使用,完成之后销毁。对象池的客户端会向对象池中请求一个对象,然后使用这个返回的对象执行相关操作。当客户端使用完毕,它将把这个特定类型的工厂对象返回给对象池,而不是销毁掉这个对象。
在初始化实例成本高,实例化率高,可用实例较少的情况下,对象池可以极大地提升性能。在创建对象(尤其是通过网络)时间花销不确定的情况下,通过对象池在可期时间内就可以获得所需的对象。
总之,对象池模式在需要耗时创建对象方面,例如创建数据库连接,套接字连接,线程和大型图形对象(比方字体或位图等),使用起来会为你节省宝贵的时间。在特定情况下,简单的对象池(没有请求外部的资源,仅仅将自身保存在内存中)或许并不会提升效率和性能,甚至会有损性能。
UML 类图
![fc8497382e7b673e4e42f7d221c74bda.png](https://i-blog.csdnimg.cn/blog_migrate/9fc7db6fc7ffa93022b2f54c60907bc4.jpeg)
★官方PHP高级学习交流社群点击进入暗号: phpzh 整理了一些资料,BAT等一线大厂进阶知识体系备好(相关学习资料以及笔面试题)以及不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货
代码
- WorkerPool.php
<?php
namespace DesignPatternsCreationalPool;
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 DesignPatternsCreationalPool;
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 DesignPatternsCreationalPoolTests;
use DesignPatternsCreationalPoolWorkerPool;
use PHPUnitFrameworkTestCase;
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);
}
}
![560eedd8b5b22cfbb74f275b058d285b.png](https://i-blog.csdnimg.cn/blog_migrate/2eebb3da2d28cb397daecb3a9b698c74.jpeg)
![e3d83930210bec520153a3b5d69c3db3.png](https://i-blog.csdnimg.cn/blog_migrate/b569c0d71a21b676426ed771161c2a3b.jpeg)
![4ec01c2d6ac9210b55875535f1db2660.png](https://i-blog.csdnimg.cn/blog_migrate/4a6d12b678fd3654cec50753068e7ab1.jpeg)
★如果喜欢我的文章,想与更多资深开发者一起交流学习的话,获取更多大厂面试相关技术咨询和指导,点击进入暗号: phpzh。
![f417526a0c6802da7cb04e23d9fee51d.gif](https://i-blog.csdnimg.cn/blog_migrate/ee1f5773e8e9da310d054b4449eb983b.gif)
参考
- ^内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题和想看的内容可以在评论提出