PHP: qué es un Singleton y para qué nos puede servir

CodingYa vengo a la carga con nuevo material. Hoy con un patrón de diseño de software que puede que necesitemos. Se trata del Singleton, que simplemente es un tipo de objeto de programación. En Programación Orientada a Objetos (POO), tenemos este tipo de objetos que se usan para sólo instanciar uno y exclusivamente uno en todo el programa.

No sabemos cuántas veces ni en cuántos lugares se va a usar el objeto. Pero sí que sabemos que necesitamos que sólo exista uno como máximo. De aquí que viene su nombre de Singleton.

Porqué

La razón de ser de los Singletones es que sólo exista una instancia del objeto en todo el programa, y que sea accesible desde todo el programa. Se usa para guardar datos o funcionalidades globales, compartidas por todo el programa. Además, esta forma de carga única y acceso global mejora el rendimiento ya que la creación del objeto se hace una vez, guardándose en memoria todo el rato hasta que finaliza la ejecución. También mejora el rendimiento porque si no se instancia nunca el objeto, no se crea, con lo que no se gasta tiempo ni espacio innecesariamente.

La idea general es, limitar el uso del constructor por defecto de la clase, de forma que no se pueda llamar para construir instancias de este objeto. Y mediante otra función llamada getInstance() controlar que sólo se llame al contructor en la primera vez. En las siguientes llamadas a la función getInstance() simplemente se devuelve el objeto que ya lo tenemos creado.

El código

<?php

class MySingleton
{
    private static $instance;
    private $counter;

    private function __construct()
    {
        echo 'Contruyendo objeto..'.PHP_EOL;
    }

    public static function getInstance()
    {
        if (!self::$instance instanceof self) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    public function hazAlgo()
    {
        echo 'Escribimos algo por pantalla.'.PHP_EOL;
        ++$this->counter;
    }

    public function getCounter()
    {
        return $this->counter;
    }
}

MySingleton::getInstance()->hazAlgo();
MySingleton::getInstance()->hazAlgo();
MySingleton::getInstance()->hazAlgo();

echo 'Contador = '.mySingleton::getInstance()->getCounter().PHP_EOL;

Cargamos este código en un fichero, por ejemplo en singleton.php y al ejecutarlo mediante ‘php singleton.php’ vemos algo como lo siguiente:

Contruyendo objeto..
Escribimos algo por pantalla.
Escribimos algo por pantalla.
Escribimos algo por pantalla.
Contador = 3

Mira que sólo en el primer getInstance se llama al contructor.

Compartir..

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

5 × 2 =