7 patrons de conception que tout développeur doit connaitre

Pragmatic Nerdz
Sep 26, 2023 - 5 Minutes

Les patrons de conception (design patterns) sont des solutions reproductibles à des problèmes courants dans la conception de logiciels.

Ils sont comme des modèles qui peuvent être utilisés pour résoudre des problèmes de conception de logiciels spécifiques en fournissant une méthode standard de résolution de ces problèmes, quel que soit le langage de programmation.

Les modèles de création

Les patrons de création fournissent des mécanismes de création d’objets qui augmentent la flexibilité et la réutilisation du code.

1. La Fabrique

La Fabrique (Factory) est un patron de conception de création qui permet d'encapsuler la création d'objets dans un objet distinct chargé de créer des instances d'autres objets.

  • Factory s'occupe de la création d'objets.
  • Component est l'interface commun de tous les objets à créer par la Factory. Les objets seront des instances des classes ConcreteComponent.
  • Le Client utilise la Factory pour créer les Components.

Application

Une application de ce patron est dans les sites de e-commerce qui supportent plusieurs méthodes de paiements.

PaymentGatewayFactory  est la fabrique qui crée les instances PaymentGateway en fonction de la méthode de paiement.

2. Singleton

Le Singleton est un patron de conception qui permet de garantir qu'une classe n'a qu'un seul exemplaire, tout en fournissant un seul point d'accès à cette instance.

Application

La connexion à la base de données dans les applications web est généralement implémentée comme Singleton. On ne peut créer d'instance car le constructeur est privé, la seule façon d'accéder à une instance est via getInstance().

class Database{
  private Database instance = Database();
  private constructor(){
    ...
  }
  public static Database getInstance(){
     return instance;
  }
  
  public void execute(sql: String){
    ...
  }
}

class Application{
  public void main(){
    Database db = Database.getInstance()
    db.execute("select * from USER")
    ...
  }
}

Les patrons structurels

Les patrons structurels vous guident pour assembler des objets et des classes en de plus grandes structures tout en gardant celles-ci flexibles et efficaces.

3. Décorateur

Le Décorateur (Decorator) est un patron de conception permet d'attacher de nouveaux comportements à des objets les enveloppant dans des emballeurs qui implémentent ces comportements.

  • Component est l'interface commun au décorateur et l'objet à emballer.
  • ConcreteComponent est l'objet à emballer.
  • Decorator est la classe qui emballe le ConcreteComponent en ajoutant les comportements additionnels.

Application

Imaginez que votre application a des problèmes de performance et vous voulez comprendre la source du problème. Vous décidez d'observer la latence de tous les appels vers le backend afin d'identifier les services les plus lents.

Pour cela, on va décorer la classe de connexion au backend et rajouter la mesure des appels.

4. Adaptateur

L'Adaptateur (Adaptor) est un patron de conception qui permet de faire collaborer des objets ayant des interfaces normalement incompatibles. 

  • Service représente la classe que l'on veux utiliser (qui est généralement une application externe)
  • Adaptor reçoit des appels du client et les convertit en appels à l’objet du Service encapsulé, dans un format qu’il peut gérer.

Application

Imaginez que vous deviez intégrer PayPal dans le module de paiement de votre e-commerce. Votre module de paiement utilise PaymentRequest et PaymentResponse comme messages pour les transactions. Par contre, PayPal utilise PayPalRequest et PayPayResponse. Donc il va falloir adapter ces interfaces incompatibles.

CreditCardGateway est l'adaptateur de PayPalService qui va faire la conversion entre le format interne du e-commerce au format de PayPal.

Patrons comportementaux

Receive my Stories your e-mail inbox as soon as I publish them.
Subscribe to my Blog

Les patrons comportementaux s’occupent des algorithmes et de la répartition des responsabilités entre les objets.

5. Commande

Commande (Command) est un patron de conception dans lequel un objet est utilisé pour encapsuler toutes les informations nécessaires pour effectuer une action.

  • Invoker qui a la responsabilité de l'envoie des commandes.
  • Command qui est l'interface commun de toute les commandes.
  • Les classes ContreteCommand ont la responsabilité d'exécuter les différentes actions, en faisant appel aux méthodes du Receiver qui contiennent la logique d'affaire.

Application

Imaginez que vous avez à implémenter la fonctionnalité de Copy/Paste dans un éditeur de texte. Vous devez ajouter ces fonctionnalités dans les barres d'outils et menu.

  • CopyCommand et PasteCommand vont implémenter les fonctionnalités de Copy/Paste en utilisant Editor .
  •  Ces commandes peuvent être invoquées à partir de la barre de menu (via CopyMenuItem et PasteMenuItem)  et de la barre de commande (via CopyButton ou PasteButton).

6. Strategie

Stratégie (Strategy) est un patron de conception qui permet de définir une famille d’algorithmes, de les mettre dans des classes séparées et de rendre leurs objets interchangeables.

  • Strategy représente l'interface commune à tous les algorithmes.
  • Les classes ConcreteStrategy représentent les différentes variantes d'algorithmes.
  • Context contient la référence de la Strategy à exécuter.

Application

Imaginez que vous êtes en train de créer une application pour trouver l'itinéraire entre 2 addresses en se déplaçant en voiture, à pied ou en transport en commun. Les itinéraires et durées vont être différents en fonction du moyen de transport.

  • RoadStrategy, PublicTransportStrategy et WalkingStrategy sont les différents algorithmes de navigation, qui implémentent tous l'interface ItineraryStrategy.
  • Navigateur est le contexte la classe utilisée par les clients pour trouver les itinéraires

7. Patron de méthode

Patron de Méthode (Template Method) est un patron de conception qui permet de mettre le squelette d’un algorithme dans la classe mère, mais laisse les sous-classes redéfinir certaines étapes de l’algorithme sans changer sa structure.

  • AbstractClass est la classe mère qui définit le squelette de l'algorithme dans la méthode templateMethod().
  • Les ConcreteClass implémentent les variantes de l'algorithme en re-définissant les méthodes step1() et step3(). 

Application

Imaginez que vous êtes en train de créer une application pour convertir des fichiers texte en PDF et HTML. Le processus de conversion est:

  1. Charger le fichier texte.
  2. Convertir le texte dans le format cible.
  3. Sauvegarder le fichier converti.

La seule différence entre les de format est dans la manière de convertir le text dans le format cible, alors on va redéfinir la fonction de conversion dans les classes concrète pour HTML et PDF.

  • AbstractExporter est la classe mère, qui définit le squelette de l'algorithme dans  la méthode export(), avec les étapes load(), convert() et save().
  • Les classes concrètes HTMLExporter et PDFExporter vont redéfinir l'étape convert().

Combiner les patrons

Dans la pratique courante, les développeurs doivent apprendre à combiner les différents patrons pour résoudre leurs problèmes.

Par exemple, pour ajouter à un éditeur de texte les fonctionnalités pour exporter le texte en PDF et HTML, on peut concevoir la solution suivante, qui combine plusieurs patrons de conception:

  • Le patron Commande est utilisé pour modéliser les interactions avec les usagers via les barres d'outil et menu.
  • Le patron Fabrique est utilisé par ExporterFactory pour créer les instances de Exporter.
  • Le patron Singleton est utilisé pour s'assurer qu'on n'a qu'une seule instance de ExporterFactory.
  • On utilise le patron Strategy pour modéliser PDFExporter et HTMLExporter, qui sont des variantes d'algorithmes de conversion en PDF et HTML.
  • Puisque les étapes de ces algorithmes sont similaires à quelques exceptions près, on utilise avec AbstractExporter le Patron de Méthode.

What's Next?

Les patrons de conception offrent des solutions éprouvées qui peuvent accélérer le processus de développement, réduisant ainsi le temps consacré à la résolution de problèmes complexes à partir de zéro. En suivant des patrons de conception, les développeurs créent un code plus robuste et fiable qui adhère aux meilleures pratiques et aux principes éprouvés.

Mais attention! Une application inappropriée de patrons de conception ou leur utilisation inutile peut conduire à un code trop complexe et diminuer la maintenance.

Si vous voulez en apprendre plus sur les patrons de conception, je vous recommande Refactoring Guru qui contient d'excellentes ressources en français. 


Si vous avez aimé l'article, montrez votre soutien avec un ❤️ et abonnez vous a mon blog! Votre engagement m’inspire!

Clean Code
Design Pattern
Patron De Conception