Éditer sur GitHub

Singleton

Problème

Nous avons une classe qui ne doit être instanciée qu'une seule fois.

Solution

UML Singleton

Source : https://fr.wikibooks.org/wiki/Patrons_de_conception/Singleton

Exemple d'implémentation

Nous pouvons par exemple définir une classe pour disposer d'un compteur global à l'application comme suit :

class Sequence {

    private static _instance: Sequence = new Sequence();

    private _current = 0;

    private constructor(){
    }

    static getInstance(): Sequence {
        return Sequence._instance ;
    }

    current(): number {
        return this._current;
    }

    next(){
        return this._current++;
    }
}

A l'utilisation, nous aurons :

const sequence = Sequence.getInstance();
console.log(sequence.next()); // 0
console.log(sequence.next()); // 1

Mise en garde

Variantes

En JavaScript et TypeScript, nous remarquerons que les concepteurs utilisent plutôt des variables globales (ex : navigator.geolocation pour l'API de géolocalisation). Il sera aussi plus naturel d'assurer l'unicité de la construction au niveau d'un module plutôt que de recourir à un constructeur privé :

// helpers/globalSequence.ts - instance globale unique de Sequence
const globalSequence : Sequence = new Sequence();
export default globalSequence ;

Liens utiles