7 patrons de conception que tout développeur doit connaitre

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 laFactory
. Les objets seront des instances des classesConcreteComponent
.- Le
Client
utilise laFactory
pour créer lesComponents
.
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 leConcreteComponent
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 duService
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
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 duReceiver
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
etPasteCommand
vont implémenter les fonctionnalités de Copy/Paste en utilisantEditor
.- Ces commandes peuvent être invoquées à partir de la barre de menu (via
CopyMenuItem
etPasteMenuItem
) et de la barre de commande (viaCopyButton
ouPasteButton
).
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 laStrategy
à 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
etWalkingStrategy
sont les différents algorithmes de navigation, qui implémentent tous l'interfaceItineraryStrategy
.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éthodetemplateMethod()
.- Les
ConcreteClass
implémentent les variantes de l'algorithme en re-définissant les méthodesstep1()
etstep3()
.
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:
- Charger le fichier texte.
- Convertir le texte dans le format cible.
- 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éthodeexport()
, avec les étapesload()
,convert()
etsave()
.- Les classes concrètes
HTMLExporter
etPDFExporter
vont redéfinir l'étapeconvert()
.
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 deExporter
. - 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
etHTMLExporter
, 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!