design-patterns
52 строки · 1.1 Кб
1<?php
2
3namespace App\Creational\Pool;
4
5class WorkerPool implements \Countable
6{
7/**
8* @var StringReverseWorker[]
9*/
10private array $occupiedWorkers = [];
11
12/**
13* @var StringReverseWorker[]
14*/
15private array $freeWorkers = [];
16
17/**
18* @return int
19*/
20public function count(): int
21{
22return \count($this->occupiedWorkers) + \count($this->freeWorkers);
23}
24
25/**
26* @return StringReverseWorker
27*/
28public function get(): StringReverseWorker
29{
30if (\count($this->freeWorkers) === 0) {
31$worker = new StringReverseWorker();
32} else {
33$worker = array_pop($this->freeWorkers);
34}
35
36$this->occupiedWorkers[spl_object_hash($worker)] = $worker;
37
38return $worker;
39}
40
41/**
42* @param StringReverseWorker $worker
43*/
44public function dispose(StringReverseWorker $worker): void
45{
46$key = spl_object_hash($worker);
47if (isset($this->occupiedWorkers[$key])) {
48unset($this->occupiedWorkers[$key]);
49$this->freeWorkers[$key] = $worker;
50}
51}
52}
53