Este es uno de los patrónes de diseño de software más sencillos de implementar. 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.
Se dice que viola los principios SOLID del diseño de software porque en sí mismo controla el proceso de creación, pero de hecho, en patrones más avanzados como en las fábricas es necesario implementarlos.
Aquí un post relacionado que te puede interesar, para refactorizar un Singleton con static. Este es un post de la serie de apuntes de repaso sobre principios y patrones de diseño software.
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.