浅谈PHP设计模式之对象池模式Pool
发布:smiling 来源: PHP粉丝网 添加日期:2022-04-27 14:51:08 浏览: 评论:0
对象池模式是一种提前准备了一组已经初始化了的对象『池』而不是按需创建或者销毁的创建型设计模式。对象池客户端会向对象池中请求一个对象,然后使用这个返回的对象执行相关操作。当客户端使用完毕,它将把这个特定类型的工厂对象返回给对象池,而不是销毁掉这个对象。
目的
在初始化实例成本高,实例化率高,可用实例不足的情况下,对象池可以极大地提升性能。在创建对象(尤其是通过网络)时间花销不确定的情况下,通过对象池在可期时间内就可以获得所需的对象。
无论如何,对象池模式在需要耗时创建对象方面,例如创建数据库连接,套接字连接,线程和大型图形对象(比方字体或位图等),使用起来都是大有裨益的。在某些情况下,简单的对象池(无外部资源,只占内存)可能效率不高,甚至会有损性能。
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);
- }
- }
Tags: PHP设计模式 PHP对象池模式
- 上一篇:解析PHP观察者模式Observer
- 下一篇:最后一页
相关文章
- ·php设计模式——单例模式(Singleton)的常见应用场景(2015-04-15)
- ·php 设计模式之单例模式例子(2016-07-27)
- ·PHP设计模式之:单例模式的学习笔记(2016-07-29)
- ·PHP设计模式之:注册模式入门教程(2016-07-29)
- ·PHP设计模式之:适配器模式入门教程(2016-07-29)
- ·PHP设计模式之:数据映射模式教程(2016-07-29)
- ·PHP设计模式之:观察者模式学习笔记(2016-07-29)
- ·PHP常用设计模式之委托设计模式(2021-07-09)
- ·php设计模式之委托模式(2021-07-09)
- ·PHP设计模式之观察者模式实例(2021-07-10)
- ·PHP设计模式之模板方法模式定义与用法详解(2021-09-06)
- ·PHP设计模式之状态模式定义与用法详解(2021-09-06)
- ·PHP设计模式之装饰器模式定义与用法详解(2021-09-06)
- ·PHP设计模式之适配器模式定义与用法详解(2021-09-06)
- ·PHP设计模式之原型模式定义与用法详解(2021-09-06)
- ·PHP设计模式之工厂模式定义与用法详解(2021-09-06)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)