Définition du Singleton
En mathématique le Singleton représente un ensemble constitué d’un élément unique. En POO (programmation orientée objet) le patron de conception Singleton reprend ce concept en permettant à une classe de renvoyer la même instance lorsqu’on l’appelle à différent endroit du programme. Savoir bien optimiser son code est une tâche importante du métier de développeur web ou du de la programmation en général. Plus la réponse du serveur est rapide, plus le site se chargera rapidement dans le navigateur du client ce qui améliore aussi le référencement. En optimisant au mieux la RAM sur le serveur, ce dernier peut répondre à plus de requêtes en même temps.
Prenons l’exemple d’une classe
permettant de gérer les différentes langues d’une application. Elle charge le fichier de traduction concernant la locale et renvoie les donnée s’y trouvant. Cette classe peut être appelée à différents niveaux de l’application web, dans une vue, un contrôleur ou un module. Si à chaque fois on instancie la classe quand on en a besoin, alors on augmente les ressources mémoires allouées au script en cours d’exécution. Ce design pattern améliore donc la clarté du code tout en optimisant la RAM du serveur.Translator
Exemple concret de ce patron de conception
Pour éviter de devoir instancier la classe à chaque utilisation, on va stocker la classe dans une propriété statique afin d’y accéder à la prochaine utilisation. Il suffit d’appeler une fonction statique nommée généralement getInstance qui renvoie cet attribut s’il n’est pas nul. Au premier appel de la fonction getInstance, le script détecte si la classe a déjà été créée et retourne l’objet statique. Voici un exemple d’un Singleton classique en PHP avec la classe Translator :
class Translator {
private static $instance;
public static function getInstance():static {
if (is_null(static::$instance)) {
static::$instance = new Translator();
}
return static::$instance;
}
}
$translator = Translator::getInstance();
Un peu d’optimisation
Ce script fait plusieurs lignes à ajouter au début de toutes les classes que l’on souhaite exploiter sous forme de Singleton. Nous pouvons factoriser le code en utilisant le principe des traits en PHP. Les traits sont une forme d’extension de classe pour inclure des propriétés et des méthodes communes à l’intérieur d’une classe. Pour étendre un trait, il suffit de l’appeler en utilisant le mot clé use. En développement web, ce mécanisme est très pratique pour appeler facilement quelques fonctions redondantes qui sont communes à plusieurs classes.
trait Singleton {
private static $instance;
public static function getInstance():static {
if (is_null(static::$_instance)) {
$class = static::class;
static::$_instance = new $class;
}
return static::$instance;
}
}
class Translator {
use Singleton;
}
$translator = Translator::getInstance();
Comparaison avec Python
Ci-dessous un script Python pour comparer le design pattern Singleton entre PHP et ce dernier. On peut remarquer que ce dernier permet d’éviter l’utilisation d’une fonction getInstance pour récupérer la classe. On peut utiliser directement le nom de la classe qui va appeler l’instance en cours.
class Translator:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
translator = Translator()
Cas d’utilisation du Singleton
Pour finir, on peut citer quelques cas d’utilisation de ce patron de conception dans une application web :
- Gestionnaire de configuration
- Gestionnaire de journalisation (pour gérer les logs)
- Gestionnaire de connexion à la base de données ou autres
- Gestionnaire de cache
- Gestionnaire de ressources
- Gestionnaire de plugins
- Gestion des préférences utilisateur
Ce design pattern trés pratique est l’un des plus populaires et des plus utilisés. De nombreux développeurs l’utilisent au quotidien. On le retrouve dans des frameworks connus comme Symfony ou même dans des plugins WordPress.