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.
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
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
<?phpclassSingleton{// Contenidor instància de la classeprivatestatic$instance=NULL;// Constructor privat, evita la creació d'objectes via newprivatefunction__construct(){}// Clone no perméspublicfunction__clone(){}// Métode singleton publicstaticfunctiongetInstance(){if(is_null(self::$instance)){self::$instance=newSingleton();}returnself::$instance;}}?>