PHP: cómo construir usando el patrón de diseño Object Pool

2022-02-03 - Categorías: General / PHP / Principios y patrones

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..
         */
    }
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

 

© 2022 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.