[C#] Design pattern : Le singleton

Type de pattern : Création
Objectif: S’assurer de l’instanciation unique d’une classe
Utilisation : Très fréquente

Le singleton un des design patterns les plus fréquemment utilisés (et peut-être même le plus courant), son objectif est de s’assurer qu’une classe n’est instanciée qu’une seule fois. Cette instance unique (et donc statique et partagée) implique un accès global à celle-ci, ce qui, comme nous le verrons plus loin, peut poser certains problèmes.

Implémentation en C#

Le pattern est relativement simple à implémenter en C#, surtout avec les versions récentes du langage. Il nécessite simplement un champ et une propriété statiques pour stocker et accéder à l’instance unique de la classe :

public class Singleton
{
    private Singleton() { }

    public static Singleton Instance { get; } = new Singleton();
}

Code source disponible sur github

Attention à l’Utilisation

Bien que le Singleton puisse sembler être une solution pratique, il est important de l’utiliser avec précaution. Une utilisation excessive ou injustifiée de ce pattern, souvent pour permettre un accès global, en a fait un anti-pattern décrié par de nombreux développeurs, notamment dans les langages orientés objet.

Car oui, le singleton brise plusieurs règles fondamentales :

  • Accès global : Une instance de classe statique la rend de facto accessible depuis n’importe quel endroit du code, et peut engendrer des dépendances non maitrisées vers celle-ci.
  • Gestion de l’état : De même, il est impossible pour cette instance de contrôler son état puisqu’elle peut-être accéder par n’importe qui à n’importe quel moment.
  • Incompatibilité avec les tests unitaires : Enfin, ce pattern est incompatible avec les tests unitaires: les raisons mentionnées précédemment et le fait qu’une même instance est utilisées pour plusieurs tests (et peut donc être impactée par chacun d’eux) ne permettent pas l’utilisation de celui-ci de façon pérenne dans des tests unitaires.

Pour aller plus loin

Le code présenté ci-dessus est un implémentation basique du pattern, qui instancie la classe (donc appelle son constructeur) dès que le type est référencé pour la première fois. Cela peut être problématique si la création de l’objet est coûteuse ou si l’objet n’est pas toujours nécessaire. Pour palier a ce problème, une implémentation dite Lazy est également disponible sur github. Cette implémentation permet de est créer l’instance uniquement lorsqu’elle est accédée pour la première fois.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *