Patró singleton

En enginyeria de programari, el patró singleton és un patró de disseny que es fa servir per a restringir la instanciació d'una classe a un objecte. Això és útil quan es necessita exactament un objecte per a coordinar accions a nivell de tot el sistema o programa. De vegades es generalitza el concepte per incloure-hi sistemes que operen de manera més eficient quan només existeix un únic objecte de la classe, o bé quan només n'hi ha un nombre reduït d'instàncies. També és considerat un anti-patró, ja que sovint és utilitzat com a eufemisme de variable global.

Usos comuns

  • Els patrons Factoria abstracta, Builder, i Prototipus poden fer servir Singletons a la seva implementació.
  • Els objectes Façana són sovint Singletons, ja que només es necessita un objecte Façana.
  • Els objectes d'estat són sovint Singletons.
  • Sovint els Singletons són preferibles a les variables locals, ja que:
    • No contaminen l'espai de noms global (o, a llenguatges sense espais de noms, el seu espai de noms contenidor) amb variables innecessàries.[1]
    • Permeten alocatació i inicialització mandrosa, on les variables globals a molts llenguatges sempre consumiran recursos.

Diagrama de classes

Diagrama de classes
Diagrama de classes

Implementació

El patró singleton s'implementa creant una classe amb un mètode que crea una nova instància de la classe si encara no n'existeix cap. En canvi, si ja n'hi ha una retorna una referència a la instància existent. Per assegurar que l'objecte no es pot instanciar de cap altra manera, el constructor es fa o bé privat o bé protegit.

Cal fer notar la distinció entre una instància estàtica d'una classe i un singleton: tot i que un singleton pot ser implementat com una instància estàtica, també pot ser construït mandrosament, de manera que no requereixi memòria o recursos fins que es necessiti. Una altra diferència notable és que les classes membre estàtiques no poden implementar una interfície, a menys que la interfície sigui simplement un marcador. Per tant si la classe ha de realitzar un contracte expressat per una interfície, s'ha de fer com un singleton.

El patró singleton ha de ser curosament construït en aplicacions multifil. Si dos fils estan a punt d'executar el mètode de creació al mateix temps quan un singleton encara no existeix, els dos han de comprovar que no existeixi la instància del singleton i després només un hauria de crear la nova. Si el llenguatge de programació té capacitat de processament concurrent, el mètode hauria de ser construït per a executar-se com una operació mútuament exclusiva.

La solució clàssica a aquest problema és fer servir exclusió mútua a la classe que indica que l'objecte està sent instanciat.

Exemples d'implementació

PHP5

<?php
class Singleton
{
 // Contenidor instància de la classe
 private static $instance = NULL;

 // Constructor privat, evita la creació d'objectes via new
 private function __construct() { }

 // Clone no permés
 public function __clone() { }

 // Métode singleton 
 public static function getInstance()
 {
 if (is_null(self::$instance)) {
 self::$instance = new Singleton();
 }

 return self::$instance;
 }
}

?>

Referències

  1. Gamma, E, Helm, R, Johnson, R, Vlissides, J: "Design Patterns", page 128. Addison-Wesley, 1995

Enllaços externs