Cours

Les patrons de conception

novembre 2026

Mickaël Borne

Plan

Les patrons de conception — Mickaël Borne — novembre 2026
01

Introduction

Les patrons de conception — Mickaël Borne — novembre 2026
Introduction

Pourquoi faire des efforts de conception ?

Il faut avoir en tête la seule constante du développement : le changement !

De nombreux événements conduiront à modifier le code d'une application :

  • Modification des fonctionnalités et modèles
  • Augmentation du nombre d'utilisateurs et des volumes de données
  • Obsolescence des outils (bibliothèques, frameworks, services tiers…)
  • Changement de cible (desktop, serveur, mobile, cloud…)
  • Choix politique (base de données, OpenSource…)
Les patrons de conception — Mickaël Borne — novembre 2026
Introduction

Sans effort de conception, plus le temps passera, plus il sera difficile, coûteux et risqué de traiter ces changements.

Les patrons de conception — Mickaël Borne — novembre 2026
Introduction

Quels sont les critères qualités d'un programme ?

Il conviendra de cibler plusieurs critères qualités qui guideront la conception :

  • Fiabilité : faire tourner le programme sans risque de plantage
  • Maintenabilité : corriger facilement un bug, mettre à jour les dépendances…
  • Performance : minimiser le temps d'exécution, la consommation de RAM, de stockage…
  • Évolutivité : ajouter facilement des fonctionnalités sans risque de régression
  • Réutilisabilité : réutiliser un code dans un autre contexte
  • Portabilité : porter facilement un programme d'une cible vers une autre
  • Testabilité : écrire facilement des tests unitaires et fonctionnels

Nous serons souvent amenés à prioriser ces critères (ex : privilégier les performances plutôt que la généricité).

Les patrons de conception — Mickaël Borne — novembre 2026
Introduction

Les patrons de conception dans tout ça ?

Ce cours s'inspire de « Design patterns : tête la première » d'Eric Freeman et Kathy Sierra. Nous verrons :

  • Les prérequis pour comprendre l'intérêt des patrons de conception : La programmation orientée objet (POO) et les principes de conception
  • Les mauvaises pratiques à travers les anti-patrons
  • Les bonnes pratiques avec les principaux patrons de conception (TP)
  • Quelques patrons architecturaux
Les patrons de conception — Mickaël Borne — novembre 2026
02

La programmation orientée objet (POO)

Les patrons de conception — Mickaël Borne — novembre 2026
La programmation orientée objet (POO)

Un paradigme omniprésent

De nombreux programmeurs manipulent des objets sans forcément en avoir conscience :

  • En appelant chaine.upper() pour transformer une chaîne de caractères en majuscules, nous faisons appel à la notation pointée typique de la POO
  • En Python, tout est objet :
Illustration de quelques types en Python
Les patrons de conception — Mickaël Borne — novembre 2026
La programmation orientée objet (POO)

Un paradigme difficile à maîtriser

Utiliser des classes existantes demandera peu d'effort. Il sera plus délicat de concevoir proprement ses propres classes :

  • Répartir les responsabilités entre les classes
  • Choisir les bonnes relations (héritage, composition…)
  • Faciliter les évolutions sans tout réécrire

Spoiler : c'est précisément l'objet des principes de conception et des patrons de conception que nous verrons par la suite !

Les patrons de conception — Mickaël Borne — novembre 2026
La programmation orientée objet (POO)

Des concepts à connaître

Les concepts suivants sont normalement connus avant de débuter ce cours :

  • Les classes avec leurs attributs et leurs méthodes
  • Les constructeurs
  • Les objets
  • La visibilité (public, private, protected)
  • Les accesseurs (get, set, add, remove…)
  • Les relations (composition, agrégation)
  • L'héritage et le polymorphisme
  • Les méthodes et classes abstraites
  • Les interfaces
  • Les méthodes statiques
  • Les attributs statiques
Les patrons de conception — Mickaël Borne — novembre 2026
La programmation orientée objet (POO)

Des concepts à comprendre

Les concepts de classe, d'attribut et d'héritage sont généralement bien maîtrisés pour modéliser des données (objet de domaine).

Il convient toutefois de bien comprendre l'intérêt des autres concepts de la POO pour modéliser des traitements :

  • Se protéger contre des erreurs de programmation (ex : visibilité, encapsulation)
  • S'assurer d'être en mesure de modifier le code sans casser les appels
  • Pouvoir tester unitairement les fonctionnalités (en bouchonnant les autres à l'aide de « mock »)

→ Méditons quelques exemples

Les patrons de conception — Mickaël Borne — novembre 2026
La programmation orientée objet (POO)

Une conception à adapter au langage (1/3)

Les langages qui permettent de définir et manipuler les concepts de base de la POO sont nombreux (Java, JavaScript (ES6), TypeScript, C++, Python, PHP…).

Ce cours s'appuiera sur des exemples et TP en TypeScript, en se concentrant sur ce qui est applicable à de nombreux langages.

  • Pourquoi TypeScript ? Typage statique, interfaces et classes abstraites, syntaxe proche de Java et C#, exécution dans le navigateur et avec Node.js
  • Pourquoi pas Java ? Le cours et les TP étaient jadis en Java (qui a le mérite d'être assez proche de la théorie)… Ne me dites pas que vous en faites encore 😅
  • Pourquoi pas Python ? Syntaxe moins naturelle (self explicite, absence de mots-clés pour la visibilité et les interfaces…)
  • Pourquoi pas C++ ? Risque de traiter principalement des spécificités du langage (gestion de la mémoire, const, passage par copie ou par référence…)
  • Pourquoi pas Rust ? Il faudrait d'abord maîtriser la propriété (~ std::unique_ptr par défaut) et l'emprunt des variables, ainsi que les traits en l'absence de classes et d'héritage… 😉
Les patrons de conception — Mickaël Borne — novembre 2026
La programmation orientée objet (POO)

Une conception à adapter au langage (2/3)

Comme l'illustre la difficulté de faire ce choix, les langages ont des spécificités qui devront être prises en compte et exploitées dans la conception, en particulier :

  • Le typage statique ou dynamique (vérification des types à la compilation ou à l'exécution)
  • La signature des méthodes (surcharge possible ou unicité des noms)
  • La gestion de la mémoire (ramasse-miettes, comptage de références, libération manuelle, notion de propriété (Rust)…)
  • La présence de concepts complémentaires (propriétés, annotations…) et de patrons intégrés (Iterator, Prototype…)

Note : certains patrons de conception que nous verrons par la suite ne seront pas adaptés à tous les langages ou demanderont des adaptations.

Les patrons de conception — Mickaël Borne — novembre 2026
La programmation orientée objet (POO)

Une conception à adapter au langage (3/3)

Aussi, la plupart des langages sont désormais multi-paradigmes (Python, JavaScript, PHP, C++…). Il faudra parfois choisir entre la définition d'une classe et celle d'une simple fonction.

Dans ce cours, nous nous concentrerons sur des approches purement POO, mais vous constaterez qu'il est possible de mixer les paradigmes :

const nombreUtilisateursMajeurs = userRepo.getUsers() // POO
  .filter(user => user.age >= 18) // programmation fonctionnelle
  .length;

Note : certains patrons de conception que nous verrons par la suite sont aujourd'hui simplifiés, voire rendus inutiles, par les concepts apparus dans les langages (lambdas, generics, générateurs…).

Les patrons de conception — Mickaël Borne — novembre 2026
03

Les principes de conception

Des principes qui s'ajoutent aux principes de base de la POO (abstraction, encapsulation…)

Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

SOLID

Nous allons commencer par 5 principes fondamentaux regroupés dans l'acronyme SOLID :

  • Single Responsibility Principle (SRP, responsabilité unique)
  • Open Closed Principle (OCP, ouvert/fermé)
  • Liskov Substitution Principle (LSP, substitution de Liskov)
  • Interface Segregation Principle (ISP, ségrégation des interfaces)
  • Dependency Inversion Principle (DIP, inversion des dépendances)
Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

(S)ingle Responsibility Principle

Une classe remplit une fonction et une seule.

À éviter

Cette classe permet la lecture des communes à partir d'un fichier ADMINEXPRESS et le calcul des statistiques sur les communes.

À privilégier

  • Cette classe permet le calcul des statistiques sur une liste de communes
  • Cette classe lit les communes à partir d'un fichier ADMINEXPRESS
Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

(O)pen Closed Principle

Une classe doit être ouverte à l'extension, mais fermée aux modifications.

À éviter

Pour modifier le comportement d'une classe existante, je modifie son code.

À privilégier

Pour modifier le comportement d'une classe, je peux en hériter et surcharger une ou plusieurs méthodes.

Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

(L)iskov Substitution Principle

Lorsqu'une classe se substitue à une autre, le programme continue de fonctionner.

À éviter

Cas 1 : j'ajoute une classe à une hiérarchie, je lance une exception « cette méthode n'est pas implémentée » sur une méthode.

Cas 2 : j'ajoute une classe à une hiérarchie, je provoque le lancement d'exception « cette méthode n'est pas implémentée pour ce type » dans d'autres parties du code.

À privilégier

Avant d'hériter d'une classe, je m'assure que je pourrai implémenter toutes les méthodes et que ça ne posera pas de problème dans le reste du code.

Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

(I)nterface Segregation Principle

Préférer plusieurs interfaces spécifiques plutôt qu'une seule interface générale.

À éviter

Je définis une interface Client avec des méthodes pour faire des requêtes HTTP (httpGet, httpPost…), télécharger des fichiers FTP (ftpGet), envoyer des mails (sendMail)…

À privilégier

Je définis une interface pour chaque protocole : HttpClient, FtpClient, Mailer.

Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

(D)ependency Inversion Principle

Il faut dépendre des interfaces, pas des implémentations (classes concrètes).

À éviter

Je référence des classes concrètes dans les déclarations des constructeurs et des méthodes :

  • GpsLocationProvider
  • GeoplateformeGeocoder

À privilégier

Je référence des interfaces dans les déclarations :

  • LocationProvider
  • Geocoder
Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

DRY : Don't Repeat Yourself

Il convient d'éviter les répétitions de code.

À éviter

Pour réutiliser un code, je le copie/colle dans ma méthode.

À privilégier

Pour réutiliser un code, je le mets en facteur dans une méthode ou une classe que j'utilise à plusieurs endroits.

Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

YAGNI : You Ain't Gonna Need It

Il convient de coder uniquement ce qui est utile, de ne pas ajouter du code en se disant que ça servira un jour.

À éviter

  • Je produis mes résultats dans de nombreux formats (shapefile, CSV, JSON, GeoJSON, GML…)
  • Je supporte la 2D et la 3D car certaines de mes sources de données sont en 3D
  • Je crée une classe Batiment avec tous les attributs BDTOPO

À privilégier

  • Je produis mes résultats dans un nombre limité de formats demandés par les utilisateurs
  • J'ignore la 3D tant que je ne l'utilise pas dans mon application
  • Je crée une classe Batiment avec les seuls attributs BDTOPO que j'utilise
Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

Principe d'exposition minimale

Il convient d'exposer un minimum de fonctionnalités au niveau d'une classe (i.e. de maximiser l'encapsulation).

En pratique, quand le langage le permet (PHP, Java, C++, TypeScript…) :

  • Les méthodes et attributs sont privés par défaut
  • Les accesseurs sont définis uniquement si c'est nécessaire (traitement.getLogger())
  • Une méthode spécifique est préférée à un accesseur permettant de nombreuses opérations
    • Les collections sont encapsulées (obj.points.add(p) → obj.addPoint(p))
Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

Identifier et encapsuler ce qui varie (1/3)

Cas d'école : j'identifie le besoin de produire des journaux applicatifs (logs) plus ou moins détaillés…

class MaClasse {

    faireUnTruc(){
        console.log("Je fais un truc");
        // ...
    }

}
Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

Identifier et encapsuler ce qui varie (2/3)

… je fais abstraction sur l'écriture des journaux applicatifs à l'aide d'une classe Logger :

class MaClasse {
    logger: Logger;

    constructor(logger: Logger){
      this.logger = logger;
    }

    faireUnTruc(){
        this.logger.info("Je fais un truc");
    }
}

Je peux ainsi configurer le niveau de production des logs au niveau de l'instance logger.

Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

Identifier et encapsuler ce qui varie (3/3)

Cette approche est aussi la clé pour rendre un code unitairement testable :

class MonTraitement {
  constructor(private httpClient: HttpClient){}

  async afficheLesCommunes(codePostal: string): void {
    const url = `https://apicarto.ign.fr/api/codes-postaux/communes/${codePostal}`;

    // Non bouchonnable (appel statique) :
    //const data = await fetch(url);
    // Bouchonnable (mock possible sur httpClient) :
    const data = await this.httpClient.get(url);
    console.log(data);
  }
}
Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

Préférer la composition à l'héritage (1/2)

  • Nous pourrons hériter d'une classe seulement si nous pouvons dire « EST-UN » :
    • « Un Cercle est une Forme »
    • « Un TraitementMetier est une BaseDeDonnees » → « Un TraitementMetier utilise une BaseDeDonnees »
  • Nous préférerons les états aux classes dérivées :
    • Il sera naturel d'hériter d'une Forme pour modéliser des Cercle et des Rectangle avec des attributs spécifiques (rayon vs largeur et hauteur)
    • Pour une classe Animal, nous préférerons l'ajout d'un attribut type à la création de classes Chat et Chien dérivées sans attributs spécifiques
Les patrons de conception — Mickaël Borne — novembre 2026
Les principes de conception

Préférer la composition à l'héritage (2/2)

Pourquoi ? Notez dans un premier temps que :

  • L'héritage est une relation plus forte que la composition (il est donc plus difficile de s'en libérer)
  • Si vous développez un formulaire, modifier un type (affectation) est plus simple que transformer un Chien en Chat (construction)

Spoiler : nous verrons plus tard avec les patrons Template Method et Strategy en quoi la composition est préférable à la surcharge d'une méthode pour faire varier le comportement d'une classe.

Les patrons de conception — Mickaël Borne — novembre 2026
04

Les anti-patrons

Mettre un nom sur des erreurs de conception courantes

Les patrons de conception — Mickaël Borne — novembre 2026
Les anti-patrons

Principe des anti-patrons

  • Nommer des erreurs de conception classiques
  • Faciliter l'identification des erreurs de conception
Les patrons de conception — Mickaël Borne — novembre 2026
Les anti-patrons

Réinventer la roue carrée

Ne pas s'appuyer sur une solution existante.

Par exemple :

  • Développer son propre système pour l'écriture des journaux applicatifs
  • Développer son propre système d'exécution de tests unitaires
Les patrons de conception — Mickaël Borne — novembre 2026
Les anti-patrons

Programmation spaghetti

Le rôle des différents éléments du système n'est pas identifiable et il est difficile de savoir qui appelle qui.

En conséquence, il est difficile de :

  • Modifier une partie du code sans en altérer le fonctionnement
  • Trouver la cause d'un bug

Spoiler : nous verrons que les patrons architecturaux amènent un cadre permettant d'éviter ce problème.

Les patrons de conception — Mickaël Borne — novembre 2026
Les anti-patrons

Objet divin

L'objet divin porte un trop grand nombre de responsabilités.

Il est en violation flagrante du principe de responsabilité unique (SRP).

Les patrons de conception — Mickaël Borne — novembre 2026
Les anti-patrons

Abstraction inverse

Un composant ne fournit pas les abstractions nécessaires, mais seulement les méthodes les plus compliquées.

Les abstractions sont développées dans les clients.

Spoiler : nous verrons comment le patron façade permet d'y remédier.

Les patrons de conception — Mickaël Borne — novembre 2026
Les anti-patrons

Marteau doré

Avec un bon marteau, tous les problèmes sont des clous ! Un outil est placé comme solution à tous les problèmes.

Il peut s'agir d'une bibliothèque, d'une base de données, d'une suite de logiciels, etc.

Les patrons de conception — Mickaël Borne — novembre 2026
Les anti-patrons

Coulée de lave

Un code non finalisé est mis en production. Il n'est plus possible de le remanier.

Ce problème pourra concerner aussi bien des bibliothèques que des API WEB ou en ligne de commande (CLI). Il conviendra de considérer que livrer revient à figer les interfaces publiques.

Spoiler : il est possible de traiter les changements en gérant proprement des versions (voir mborne.github.io - Le refactoring).

Les patrons de conception — Mickaël Borne — novembre 2026
Les anti-patrons

Premature Optimisation (1/2)

« Premature optimization is the root of all evil » (Donald Knuth)

  • Gaspillage d'énergie pour des gains médiocres (voire négatifs)
  • Complexité rendant impossible les optimisations globales
  • Complexité mettant en péril la qualité du logiciel (stabilité, maintenabilité, portabilité…)

Exemples :

  • Optimiser le parcours séquentiel d'un tableau au point qu'il devient impossible d'exploiter un index spatial
  • « Je n'ai pas besoin des arcs entrants pour cet algorithme, je développe une classe dédiée pour ce graphe afin de consommer moins de mémoire ! ». Bilan : le programme réel qui fait appel à plusieurs algorithmes doit faire des copies de graphes.
Les patrons de conception — Mickaël Borne — novembre 2026
Les anti-patrons

Premature Optimisation (2/2)

« Premature optimization is the root of all evil » (Donald Knuth) mais :

  • Il ne faut pas en conclure que l'optimisation doit être ignorée dans la conception !
  • Il faut rester prudent sur cette affirmation pour les bibliothèques de bas niveau !
  • Parfois, on privilégie la performance à la généricité.

Proposition de méthode :

  • Se concentrer sur les optimisations globales dans la conception (choix de structures efficaces, indexation, mise en cache…)
  • Coder en mettant en place des tests et des mesures de performance (bench)
  • Profiler et réaliser les optimisations locales sur les fonctions souvent appelées
Les patrons de conception — Mickaël Borne — novembre 2026
05

Les patrons de conception

Nous y venons enfin ! Alors, les patrons de conception, quésako ?

Les patrons de conception — Mickaël Borne — novembre 2026
Les patrons de conception

Définition

Le concept de patron de conception a été défini par le « Gang of Four » (Erich Gamma, Richard Helm, Ralph Johnson et John Vlissides) dans le livre « Design Patterns — Elements of Reusable Object-Oriented Software » (1994).

Un patron de conception est la description d'une solution réutilisable pour un problème de conception.

Les patrons de conception — Mickaël Borne — novembre 2026
Les patrons de conception

Formalisme des patrons de conception

Ces patrons obéiront au formalisme suivant :

  • Un nom
  • Un problème
  • Une solution
  • Des conséquences (avantages et inconvénients)
Les patrons de conception — Mickaël Borne — novembre 2026
Les patrons de conception

Familles de patrons de conception du GoF

Le « Gang of Four » définit trois familles de patrons de conception :

  • Les patrons de création (creational patterns) qui décrivent des techniques d'initialisation des objets
  • Les patrons de structure (structural patterns) qui décrivent des organisations classiques de classes
  • Les patrons de comportement (behavioral patterns) qui décrivent des méthodes de communication entre objets
Les patrons de conception — Mickaël Borne — novembre 2026
Les patrons de conception

Autres familles de patrons de conception

Le concept de patron sera étendu par la suite et nous trouverons en complément :

  • Des patrons architecturaux qui traitent des styles d'architecture de logiciel (MVC, micro-service…)
  • Des familles de patrons spécifiques à des domaines d'application (cloud, big-data…)
  • Des familles de patrons spécifiques à des frameworks (Spring…)
Les patrons de conception — Mickaël Borne — novembre 2026
Les patrons de conception

Intérêts des patrons de conception (1/2)

Les patrons de conception permettront de :

  • Faciliter la compréhension des codes par l'utilisation d'un vocabulaire commun (*Builder, *Factory, addChild…)
  • Faciliter la découverte du code et la compréhension des architectures en standardisant celles-ci (MVC, IoC, MQ…)
  • Trouver de l'inspiration dans la recherche d'une solution :
    • Comment implémenter un interpréteur ? un annuler/refaire ?
    • Existe-t-il un framework MVC avec injection de dépendance pour ce langage ?
Les patrons de conception — Mickaël Borne — novembre 2026
Les patrons de conception

Intérêts des patrons de conception (2/2)

En particulier, la connaissance des patrons facilitera l'apprentissage et la découverte des bibliothèques et frameworks orientés objets.

Pour faire simple, sans connaissance des patrons, certains choix de conception sembleront inutilement complexes et il sera difficile de trouver comment initialiser les objets.

Les patrons de conception — Mickaël Borne — novembre 2026
Les patrons de conception

Les patrons de création

Nous nous concentrerons sur les patrons de création du GoF ci-après :

Nous irons un peu plus loin avec :

Les patrons de conception — Mickaël Borne — novembre 2026
Les patrons de conception

Les patrons de structure

Nous nous concentrerons sur les patrons de structure du GoF ci-après :

Nous noterons qu'il en existe d'autres :

  • Proxy
  • Flyweight (Poids-mouche)
Les patrons de conception — Mickaël Borne — novembre 2026
Les patrons de conception

Les patrons de comportement

Nous nous concentrerons sur les patrons de comportement du GoF ci-après :

  • State (État)
  • Mediator (Médiateur)
  • Command (Commande)
  • Interpreter (Interpréteur)
  • Memento (Mémento)

Nous nous intéresserons en complément à :

Les patrons de conception — Mickaël Borne — novembre 2026
Les patrons de conception

À vous maintenant !

Pour bien comprendre l'intérêt des patrons de conception, nous allons traiter le TP - Patrons de conception avec des classes géométriques

Les patrons de conception — Mickaël Borne — novembre 2026
06

Les patrons architecturaux

Les mêmes principes à l'échelle d'une application ou d'un système

Les patrons de conception — Mickaël Borne — novembre 2026
Les patrons architecturaux

Des patrons à l'échelle du système

Au-delà des patrons à l'échelle de quelques classes, nous soulignerons l'existence de patrons architecturaux agissant à l'échelle d'une application ou d'un système :

Les patrons de conception — Mickaël Borne — novembre 2026
07

Conclusion

Les patrons de conception — Mickaël Borne — novembre 2026
Conclusion

Comment progresser ?

Il est fondamental de respecter les principes de conception à tous les niveaux du système et les patrons de conception peuvent vous aider :

  • Comprendre et apprendre les principaux patrons de conception
  • Identifier les patrons de conception dans les codes existants (fabriques, monteurs, stratégies, décorateurs…)
  • Concevoir en pensant aux principes et patrons de conception (sans sombrer dans la « patternite »)
  • Concevoir des codes en les testant unitairement (un code mal conçu ne pouvant être testé unitairement)
  • Refactorer des codes existants pour respecter les principes de conception en introduisant au besoin des patrons (voir le refactoring)
  • Comprendre des architectures existantes (les mêmes principes s'appliquent à diverses échelles des systèmes)
  • Expérimenter (et apprendre de ses erreurs) !
Les patrons de conception — Mickaël Borne — novembre 2026

Merci

Annexes et références

Des questions, des remarques ? Ajoutez une issue