Continuando con los resúmenes sobre patrones de diseño del software llegamos al patrón Object Pool, que traducido significa Grupo de Objetos.
Este patrón está orientado a mejorar el rendimiento de la creación de objetos con alto coste temporal o espacial. Es decir, es para mejorar el uso de los recursos. Se genera una serie de objetos al inicio del programa, o la primera vez, para ir cogiendo los objetos del pool, y después devolverlos para que otros procesos o módulos del programa los reutilicen sin tener que volver a crearlos.
Se puede usar para crear conexiones remotas, carga de ficheros en memoria, generación de mapas.. todo tipo de objetos que sean costosos de crear.
Al grano, cómo se puede programar un sencillo Object Pool en PHP
Por ejemplo, un programa principal que arranca el ObjectPool y usa los objetos:
<?php
class Main
{
private $objectPool;
public function __construct()
{
$this->objectPool = new ObjectPool();
}
public function doSomething()
{
/**
* More code..
*/
$bigObject = $this->objectPool->getNextObject();
$bigObject->doSomethingWithThisObject();
/**
* More code..
*/
$bigObject = $this->objectPool->getNextObject();
$bigObject->doSomethingWithThisObject();
/**
* More code..
*/
$bigObject = $this->objectPool->getNextObject();
$bigObject->doSomethingWithThisObject();
}
}
..el ObjectPool en sí mismo, que contiene lo principal para este patrón de software:
<?php
class ObjectPool
{
private $poolSize = 3;
private $poolInstances = [];
private $current = 0;
public function __construct()
{
for ($i = 0; $i < $this->poolSize; ++$i) {
$this->poolInstances = new BigObject();
}
}
public function getNextObject()
{
$returningObject = $this->poolInstances[$this->current];
++$this->current;
if ($this->current >= $this->poolSize) {
$this->current = 0;
}
/*
* BigObject is a complex object, so it's returned by reference,
* so changes in the returned object are done everywhere..
*/
return $returningObject;
}
}
..y los objetos costosos de crear, sólo una estructura:
<?php
class BigObject
{
public function __construct()
{
/*
* This goes the main program,
* with a lot of heavy things to call,
* or to do..
*/
}
public function doSomethingWithThisObject()
{
/*
* More code..
*/
}
}