Design Pattern 3 PDF
Document Details
Uploaded by RightPeridot8225
Tags
Summary
This document details design patterns, specifically focusing on Abstract Factory and Builder design patterns. The document provides explanations, examples, and implementation details in Java. The document is well-structured and easy to follow for understanding the concepts and their use cases.
Full Transcript
Chapitre 3 I. Introduction aux Patterns Créationnels 1. Rappel des concepts clés des patterns créationnels : Les patterns créationnels gèrent la création d’objets tout en cachant la logique de création et en centralisant cette logique pour augmenter la flexibilité et l’eff...
Chapitre 3 I. Introduction aux Patterns Créationnels 1. Rappel des concepts clés des patterns créationnels : Les patterns créationnels gèrent la création d’objets tout en cachant la logique de création et en centralisant cette logique pour augmenter la flexibilité et l’efficacité. Dans la séance précédente, nous avons vu deux patterns créationnels fondamentaux : Singleton et Factory Method. Aujourd’hui, nous allons explorer deux autres patterns créationnels : Abstract Factory et Builder. 2. Problématique : Que faire lorsque l’on doit créer des objets complexes, qui sont com- posés de plusieurs sous-objets ou nécessitent des configurations spé- cifiques ? Comment créer des familles d’objets interdépendants sans coupler leur création à l’application principale ? II. Le Pattern Abstract Factory 1. Introduction au Pattern Abstract Factory : Objectif : Le pattern Abstract Factory fournit une interface pour créer des familles d’objets interconnectés sans spécifier leurs classes concrètes. Il permet à des sous-classes d’instancier les objets de la famille à laquelle elles appartiennent. Cas d’utilisation communs : – Interfaces graphiques : Création d’interfaces compatibles avec différents systèmes d’exploitation (Windows, MacOS, Linux) en gérant les fenêtres, boutons et autres éléments spécifiques à chaque OS. – Systèmes de gestion de bases de données : Création d’objets spécifiques pour interagir avec différentes bases de données (MySQL, PostgreSQL, Oracle). 2. Problèmes résolus par Abstract Factory : Centralisation de la création d’objets interdépendants : Le pattern permet de créer des objets en groupe, en fonction de leur famille ou type. Cohérence entre les objets : Assure que les objets créés appar- tiennent à la même famille (ex. créer des fenêtres et des boutons spécifiques à une plateforme comme Windows ou MacOS). Découplage : Le client n’a pas besoin de connaître les détails d’implémentation des objets créés ; il ne manipule que des interfaces 1 abstraites. 3. Structure du Pattern Abstract Factory : Participants : – Abstract Factory : Déclare une interface pour créer des objets abstraits. – Concrete Factory : Implémente l’interface pour créer des ob- jets concrets. – Abstract Product : Déclare une interface pour un type d’objet que la factory crée. – Concrete Product : Implémente un produit abstrait spéci- fique. – Client : Interagit avec les interfaces abstraites pour créer des objets, sans se soucier des classes concrètes. 4. Exemple d’implémentation en Java : Interface pour les produits abstraits : interface Button { void paint(); } interface Checkbox { void paint(); } Produits concrets pour Windows : class WindowsButton implements Button { public void paint() { System.out.println("Rendering a button in Windows style."); } } class WindowsCheckbox implements Checkbox { public void paint() { System.out.println("Rendering a checkbox in Windows style."); } } Produits concrets pour MacOS : class MacButton implements Button { public void paint() { System.out.println("Rendering a button in MacOS style."); } } 2 class MacCheckbox implements Checkbox { public void paint() { System.out.println("Rendering a checkbox in MacOS style."); } } Factory abstraite : interface GUIFactory { Button createButton(); Checkbox createCheckbox(); } Factories concrètes pour chaque système d’exploitation : class WindowsFactory implements GUIFactory { public Button createButton() { return new WindowsButton(); } public Checkbox createCheckbox() { return new WindowsCheckbox(); } } class MacFactory implements GUIFactory { public Button createButton() { return new MacButton(); } public Checkbox createCheckbox() { return new MacCheckbox(); } } Client : class Application { private Button button; private Checkbox checkbox; public Application(GUIFactory factory) { button = factory.createButton(); checkbox = factory.createCheckbox(); } public void paint() { button.paint(); checkbox.paint(); 3 } } Utilisation : public class Main { public static void main(String[] args) { GUIFactory factory; String osName = System.getProperty("os.name").toLowerCase(); if (osName.contains("mac")) { factory = new MacFactory(); } else { factory = new WindowsFactory(); } Application app = new Application(factory); app.paint(); } } 5. Avantages et inconvénients du pattern Abstract Factory : Avantages : – Favorise la cohérence entre les objets créés. – Encapsulation de la logique de création d’objets complexes ou interdépendants. – Flexibilité pour ajouter ou changer des familles d’objets sans modifier le code client. Inconvénients : – Ajoute de la complexité en multipliant le nombre de classes. – Peut être lourd à implémenter lorsque les familles d’objets sont nombreuses ou complexes. 6. Exercice pratique sur Abstract Factory : Objectif : Implémenter un système de génération de widgets (bou- tons, fenêtres, menus) pour une application supportant plusieurs thèmes (Thème clair et Thème sombre). Indications : Utiliser Abstract Factory pour garantir que chaque composant de l’interface suit le même thème graphique. III. Le Pattern Builder 1. Introduction au Pattern Builder : Objectif : Le pattern Builder permet de construire progressivement des objets complexes en séparant leur construction de leur représen- 4 tation. Il est particulièrement utile lorsque des objets comportent de nombreux paramètres ou sous-éléments. Cas d’utilisation communs : – Création de documents complexes (par exemple, des docu- ments HTML ou XML). – Constructeurs de formulaires ou de questionnaires, où plusieurs options peuvent être ajoutées de manière flexible. – Création d’objets immuables en Java ou Python (par exem- ple, la classe StringBuilder en Java). 2. Problèmes résolus par Builder : Complexité de création d’objets : Permet de créer des objets ayant plusieurs étapes de construction, sans rendre le constructeur principal trop complexe. Flexibilité : Le pattern Builder permet de créer des variantes d’objets complexes de manière claire et organisée. Lisibilité : En fragmentant la construction d’un objet, le code de- vient plus lisible et plus modulaire. 3. Structure du Pattern Builder : Participants : – Builder : Déclare des méthodes abstraites pour construire les différentes parties d’un objet. – Concrete Builder : Implémente les méthodes de construction pour assembler les différentes parties de l’objet. – Director (optionnel) : Définit l’ordre de la construction. – Product : Représente l’objet complexe à créer. – Client : Utilise le builder pour construire un objet. 4. Exemple d’implémentation en Java : Classe produit complexe : class House { private String foundation; private String structure; private String roof; private String interior; public void setFoundation(String foundation) { this.foundation = foundation; } public void setStructure(String structure) { this.structure = structure; } public void setRoof(String roof) { this.roof = roof; } public void setInterior(String interior) { this.interior = interior; } @Override public String toString() { return "House [Foundation=" + foundation + ", Structure=" + structure + 5 ", Roof=" + roof + ", Interior=" + interior + "]"; } } Interface Builder : interface HouseBuilder { void buildFoundation(); void buildStructure(); void buildRoof(); void buildInterior(); House getHouse(); } Concrete Builder : class ConcreteHouseBuilder implements HouseBuilder { private House house; public ConcreteHouseBuilder() { this.house = new House(); } @Override public void buildFoundation() { house.setFoundation("Concrete, cement, and rebar"); } @Override public void buildStructure() { house.setStructure("Wood and steel framing"); } @Override public void buildRoof() { house.setRoof("Composite shingles"); } @Override public void buildInterior() { house.setInterior("Drywall, paint, and fixtures"); } @Override public House getHouse() { return this.house; 6 } } Director (optionnel) : class ConstructionDirector { private HouseBuilder builder; public ConstructionDirector(HouseBuilder builder) { this.builder = builder; } public House constructHouse() { builder.buildFoundation(); builder.buildStructure(); builder.buildRoof(); builder.buildInterior(); return builder.getHouse(); } } Client : public class Main { public static void main(String[] args) { HouseBuilder builder = new ConcreteHouseBuilder(); ConstructionDirector director = new ConstructionDirector(builder); House house = director.constructHouse(); System.out.println(house); } } 5. Avantages et inconvénients du pattern Builder : Avantages : – Permet de créer des objets complexes étape par étape. – Facilite la gestion des variantes d’un même produit. – Réutilisabilité du code pour créer des objets similaires mais légèrement différents. Inconvénients : – Ajoute des niveaux supplémentaires d’abstraction, ce qui peut rendre le code plus complexe à comprendre. – Moins efficace pour les objets simples. 6. Exercice pratique sur Builder : Objectif : Implémenter un Builder pour créer une voiture avec différentes configurations (par exemple, type de moteur, couleur, in- térieur). 7 Indications : Utiliser un Builder pour configurer chaque élément de la voiture indépendamment, puis assembler le tout. IV. Discussion & Conclusion 1. Révision des concepts : Abstract Factory : Centraliser la création de familles d’objets in- terdépendants. Builder : Créer des objets complexes étape par étape de manière flexible. 2. Discussion ouverte : Quand choisir Abstract Factory plutôt que Factory Method ou Builder ? Avez-vous rencontré des situations dans vos projets personnels où l’un de ces patterns aurait été utile ? 3. Devoir pour la prochaine séance : Lire sur les patterns structurels : Adapter et Bridge. Réfléchir à un projet dans lequel vous pourriez utiliser Abstract Factory ou Builder. 8