Design Patterns. Taha Zerrouki

Documents pareils
Plan. Patrons de conception. Motivations. Design Pattern : principe. Philippe Collet

Patrons de Conception (Design Patterns)

Analyse,, Conception Objet

Héritage presque multiple en Java (1/2)

Modélisation UML. Christine Solnon INSA de Lyon - 3IF 1/140.

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Présentation du PL/SQL

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Design patterns. Design patterns - définition. Design patterns - avantages

Chapitre 2. Classes et objets

Projet Active Object

Programmer en JAVA. par Tama

Premiers Pas en Programmation Objet : les Classes et les Objets

Le développement d'applications informatiques

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Diagramme de classes

Initiation à JAVA et à la programmation objet.

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Chapitre VI- La validation de la composition.

Génie Logiciel avec Ada. 4 février 2013

LOG4430 : Architecture logicielle et conception avancée

Par Laurent DESECHALLIERS. Mastère Spécialisé en Management de Projets en Milieu Industriel. CESI de Rouen Promotion 2002/2003.

INITIATION AU LANGAGE JAVA

STAGE IREM 0- Premiers pas en Python

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Objets et Programmation. origine des langages orientés-objet

IFT2255 : Génie logiciel

Annexe : La Programmation Informatique

Formation, Audit, Conseil, Développement, UX WinRT Silverlight WPF Android Windows Phone

Analyse et Conception objet du logiciel Analyse et conception objet du logiciel : Méthode de conception objet et notation UML.

SSTIC Désobfuscation automatique de binaires. Alexandre Gazet. Yoann Guillot. Et autres idyles bucoliques...

Solution A La Gestion Des Objets Java Pour Des Systèmes Embarqués

Entraînement au concours ACM-ICPC

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

TP1 : Initiation à Java et Eclipse

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Plan Pédagogique du cours

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Traduction des Langages : Le Compilateur Micro Java

4. Groupement d objets

Gestion mémoire et Représentation intermédiaire

Cours 14 Les fichiers

Composants Logiciels. Le modèle de composant de CORBA. Plan

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

Évaluation et implémentation des langages

Analyse,, Conception des Systèmes Informatiques

IFT785 Approches Orientées Objets. FINAL Été Remise : Jeudi 19 août 2002 à 9h00 am

Programmation Orientée Objet

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Cours de Programmation 2

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Web & Libre. Outils pour être présent sur le net librement

Plan du cours. Historique du langage Nouveautés de Java 7

Java DataBaseConnectivity

Classes et Objets en Ocaml.

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmation en Java IUT GEII (MC-II1) 1

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Livre Blanc WebSphere Transcoding Publisher

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Généralités sur le Langage Java et éléments syntaxiques.

as Architecture des Systèmes d Information

Génie Logiciel Orienté Objet UML

Bases Java - Eclipse / Netbeans

RTDS G3. Emmanuel Gaudin

Développement d un interpréteur OCL pour une machine virtuelle UML.

Logiciel Libre Cours 2 Fondements: Programmation

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Programmation par composants (1/3) Programmation par composants (2/3)

Urbanisation de système d'information. PLM 3 (Product Lifecycle Management) Élaborations, versions, variantes, configurations

Langage Java. Classe de première SI

Initiation à l algorithmique

Générer du code à partir d une description de haut niveau

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Initiation à la programmation en Python

LES OUTILS D ALIMENTATION DU REFERENTIEL DE DB-MAIN

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Chapitre VIII. Les bases de données. Orientées Objet. Motivation

Cours de Génie Logiciel

Description de la formation

LOG4430 : Architecture et conception avancée

Chapitre 2 : Abstraction et Virtualisation

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

RMI le langage Java XII-1 JMF

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Les BRMS Business Rules Management System. Groupe GENITECH

Corrigés des premiers exercices sur les classes

WINDOWS SHAREPOINT SERVICES 2007

OCL - Object Constraint Language

Transcription:

Design Patterns Taha Zerrouki Taha.zerrouki@gmail.com

Généralités La notion de pattern vient dès qu : on est amené à répéter plusieurs fois le même genre de tâche. par exemple le même genre de développement logiciel avec le même genre de problème à résoudre. 2

Généralités Synonymes connus: Forme de conception, modèle, patron de conception, motif, etc. 3

Origines Proposition de Cristopher Alexander: Description d'un problème récurrent et de sa solution Cristopher Alexander et al.: A Pattern Language, 1977 Cristopher Alexander: The TimelessWay of Building, 1979 4

Définition d Alexander «Chaque patron décrit un problème qui se manifeste constamment dans notre environnement, et donc décrit le cœur de la solution à ce problème, d une façon telle que l on puisse réutiliser cette solution des millions de fois, sans jamais le faire deux fois de la même manière» Ou tout simplement: une solution générale pour un problème récurrent dans un contexte donné 5

6

7

8

Origines Alexander propose de structurer les patrons selon quelques champs dont les principaux sont : le nom une illustration graphique le contexte d utilisation le problème la solution générique les conséquences de l emploi du patron. Ces champs forment le cœur d une solution qui peut être facilement réemployée. 9

Origines Le nom des patrons et leur utilisation référencée crée ce qu Alexander appelle un langage de patron «pattern language» 10

Pourquoi pas en informatique?? Les besoins pour une bonne conception et du bon code : Extensibilité Flexibilité Facilité à maintenir Réutilisabilité Les qualités internes Meilleure spécification, construction, documentation 11

Informatique 1987 - Cunningham et Beck utilisent les idées d'alexander pour développer un petit langage de patrons pour Smalltalk 1990 Le Gang des 4 («Gang of Four» : Gamma, Helm, Johnson and Vlissides) commence à travailler à la compilation d'un catalogue de patrons de conceptions 12

Informatique 1993 - Kent Beck et Grady Booch sponsorisent la première réunion de ce qui est maintenant connu comme le groupe http://www.hillside.net Hillside 1995 - Le Gang des 4 (GoF) publie le livre des Patrons de conception 1996 A system of Patterns, Buchmann et. al. 13

Classification du GoF Patrons de création (5) Factory Method Abstract Factory Builder Prototype Singleton Patrons de structure (7) Adapter Bridge Composite Decorator Facade Flyweight Proxy Patrons de comportement (11) Interpreter Template Method Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor Les plus populaires sont ceux mis en gras 14

Creation Patterns Patron de Création 15

Creation Patterns Patron de Création 16

Patron de création Abstraction du processus d instanciation. Rendre le système indépendant du mode de création des objets qui le compose. Encapsulation de la connaissance des classes concrètes à utiliser Cacher la manière dont les instances sont créées et combinées Deux types Patron de création de classe : utilisation de l héritage pour faire varier la classe instanciée (ex. Factory) Patron de création d objets : délégation de la construction à un autre objet (ex. AbstractFactory, Builder) 17

18

Factory Method Méthode de fabrication (usine) 19

Instanciation au moment de l exécution Quand vous utilisez new, vous instanciez une classe concrète : Il s agit d une implémentation, non d une interface. Lier le code à une classe concrète peut le rendre plus fragile et plus rigide. Quand vous avez tout un ensemble de classes concrètes apparentées, vous êtes souvent obligé d écrire du code qui ressemble au fragment Suivant: if cond1: ob = A(); elif cond2: ob = B(); elif cond3: ob = C() ; A I n C B 20

Exemple sans Factory class Shape:... class Circle(Shape): def draw(self): print("circle.draw") def erase(self): print("circle.erase") class Square(Shape): def draw(self): print("square.draw") def erase(self): print("square.erase") # main for type in ("Circle", "Square","Circle", "Square"): if type == "Circle": shape = Circle() elif type == "Square": shape = Square() else: print "Bad shape creation: " + type sys.exit() shape.draw() shape.erase() 21

Instanciation au moment de l éxecution Plusieurs instanciations de classes concrètes et la décision de la classe à instancier est prise au moment de l exécution, en fonction d un certain nombre de conditions. Ce type de code se retrouve souvent dans plusieurs parties de l application maintenance et mises à jour plus difficiles et plus sujettes à l erreur code n ai pas «fermé à la modification» 22

Identifier ce qui varie for type in ("Circle", "Square","Circle", "Triangle"): if type == "Circle": shape = Circle() elif type == "Square": shape = Square() elif type == "Triangle": shape = Triangle() else: print "Bad shape creation: " + type sys.exit() shape.draw() shape.erase() 23

Patron de conception Tout d abord, nous extrayons le code qui crée les objets le mettre dans la méthode createshape() def createshape(type): if type == "Circle": return Circle() elif type == "Square": return Square() else: print "Bad shape creation: " + type sys.exit() Une technique courante est de rendre cette méthode statique (fabrique statique) car on n a pas besoin d instancier un objet pour utiliser la méthode de création, mais cela ne résout pas le problème Inconvénient : vous ne pouvez pas sous-classer ni modifier le comportement de la méthode de création (méthode de classe) 24

Une technique courante est de rendre cette méthode statique (fabrique statique) car on n a pas besoin d instancier un objet pour utiliser la méthode de création, mais cela ne résout pas le problème Inconvénient : vous ne pouvez pas sous-classer ni modifier le comportement de la méthode de création (méthode de classe) 25

Exemple avec Factory method class ShapeFactory: # Create based on class name: @staticmethod def factory(type): if type == "Circle": return Circle() elif type == "Square": return Square() else: print "Bad shape creation: " + type sys.exit() for i in ("Circle", "Square","Circle", "Square"): shape = Shapefactory.factory(i) shape.draw() shape.erase() 26

Exercice Modifier le code précédent pour ajouter la forme «Triangle» class ShapeFactory: # Create based on class name: @staticmethod def factory(type): if type == "Circle": return Circle() elif type == "Square": return Square() else: print "Bad shape creation: " + type sys.exit() class Circle(Shape): def draw(self): print("circle.draw") def erase(self): print("circle.erase") class Square(Shape): def draw(self): print("square.draw") def erase(self): print("square.erase") # main for i in ("Circle", "Square","Circle", "Square"): shape = ShapeFactory.factory(i) shape.draw() 27

Exercice On veut réaliser une Factory qui crée les objets circle et square, et une autre qui crée les triangles et les squares class ShapeFactory: # Create based on class name: @staticmethod def factory(type): if type == "Circle": return Circle() elif type == "Square": return Square() else: print "Bad shape creation: " + type sys.exit() class ShapeFactory_CS(ShapeFactory): # Create based on class name: @staticmethod def factory(type): if type == "Circle": return Circle() elif type == "Square": return Square() else: print "Bad shape creation: " + type sys.exit() 28

Solution On veut réaliser une Factory qui crée les objets circle et square, et une autre qui crée les triangles et les squares class ShapeFactory_CS(ShapeFactory): # Create based on class name: @staticmethod def factory(type): if type == "Circle": return Circle() elif type == "Square": return Square() else: print "Bad shape creation: " + type sys.exit() class ShapeFactory_TS(ShapeFactory): # Create based on class name: @staticmethod def factory(type): if type == "Circle": return Circle() elif type == "Triangle": return Triangle() else: print "Bad shape creation: " + type sys.exit() 29

Description du pattern Factory Method Intention Choisit la bonne sous-classe en fonction de certains paramètres Permet la délégation d instanciation : cache la classe concrète utilisée (permet l évolution) Utilisations connues Applications graphiques, un peu partout... Synonyme Constructeur virtuel, Fabrique, Fabrication, Usine Patterns associés (en relation) Abstract Factory, Template Method, Prototype 30

Description du pattern Factory Method Problème (Applicabilité, Quand l utiliser?) Une classe est incapable d anticiper le type d objets qu elle doit créer Une classe désire laisser le choix du type d objets créés à ses sousclasses Solution 31

Description du pattern Factory Method Participants Product : définit l interface des objets créés par la fabrication ConcreteProduct : implémente l interface Product Creator : déclare la fabrication; celle-ci renvoie un objet de type Product. Le Creator peut également définir une implémentation par défaut de la fabrication, qui renvoie un objet ConcreteProduct par défaut. Il peut appeler la fabrication pour créer un objet Product ConcreteCreator : surcharge la fabrication pour renvoyer une instance d un ConcreteProduct 32

Conséquence Avantage : Elimine la nécessité de lier les classes spécifiques à l'application dans votre code (le client). Le code ne traite que l'interface du produit; il peut donc travailler avec toutes classe ConcreteProduct définie par l'utilisateur. Inconvénient : Les clients pourraient avoir à sous-classer la classe Créateur juste pour créer un objet ConcreteProduct particulier. 33

Implémentation Deux variétés principales Le Créateur ne fournit pas une implémentation pour la méthode de fabrique Le Créateur fournit une implémentation par défaut de la méthode de fabrique. Factory Method paramétrée Créer plusieurs types de produits La méthode de fabrication prend un paramètre qui identifie le type d'objet à créer. L'objet partage l'interface du produit 34

Exercice Implementer les classes et le Factory de ces classes 35

36

Exercice On veut créer des Pizzerias avec des produits différents Pizzeria d ElHouma produit que le pizza simple et avec thon. Pizzeria de Lux ne produit pas de pizza simple. 37

Abstract Factory Method Méthode de fabrication Abstraite (usine) 38

Abstract Factory Elle fournit : une interface pour créer des familles d'objets liés ou inter-dépendants sans avoir à préciser au moment de leur création la classe concrète à utiliser 39

Abstract Factory Elle fournit une interface pour créer des familles d'objets liés ou inter-dépendants sans avoir à préciser au moment de leur création la classe concrète à utiliser 40

Abstract Factory Elle fournit une interface pour créer des familles d'objets liés ou inter-dépendants sans avoir à préciser au moment de leur création la classe concrète à utiliser 41

Exemple 42

Les classes class Circle(Shape): def draw(self) : print("circle.draw") def erase(self): print("circle.erase") class Circle2D(Circle): def draw(self) : print("circle.draw2d") def erase(self): print("circle.erase2d") class Circle3D(Circle): def draw(self) : print("circle.draw3d") def erase(self): print("circle.erase3d") class Square(Shape): def draw(self) : print("square.draw") def erase(self): print("square.erase") class Square2D(Square): def draw(self) : print("square.draw2d") def erase(self): print("square.erase2d") class Square3D(Square): def draw(self) : print("square.draw3d") def erase(self): print("square.erase3d") 43

Classes Factory class ShapeFactory: @staticmethod def createshape(type): pass class ShapeFactory2D(ShapeFactory): @staticmethod def createshape(type): if type == "Circle": return Circle2D() elif type == "Square": return Square2D() else: return None class ShapeFactory3D(ShapeFactory): @staticmethod def createshape(type): if type == "Circle": return Circle3D() elif type == "Square": return Square3D() else: return None 44

Appel # creation des objets 2 D for type in ("Circle", "Square","Circle", "Square"): shape = ShapeFactory2D.createShape(type) shape.draw() shape.erase() # creation des objets 3 D for type in ("Circle", "Square","Circle", "Square"): shape = ShapeFactory3D.createShape(type) shape.draw() shape.erase() 45

Abstact Factory Intention Fournir une interface pour créer des familles d objets dépendants ou associés sans connaître leur classe réelle Fabriquer des fabriques. Utilisations connues Fabriquer des widgets qui ont tous le même look&feel Synonymes : Kit, Fabrique abstraite, Usine abstraite Patrons en relation Factory Method, Prototype, Singleton. 46

Abstact Factory Problème Un système doit être indépendant de la façon dont ses produits sont créés, assemblés, représentés Un système repose sur un produit d'une famille de produits Une famille de produits doit être utilisée ensemble, pour renforcer cette contrainte On veut définir une interface unique à une famille de produits concrets 47

Abstact Factory Solution 48

Abstract Factory Participants AbstractFactory déclare l interface pour les opérations qui créent des objets abstraits ConcreteFactory implémente les opérations qui crée les objets concrets AbstractProduct déclare une interface pour un type d objet ConcreteProduct définit un objet qui doit être créé par la fabrique concrète correspondante et implémente l interface AbstractProduct Client utilise seulement les interfaces déclarée par AbstractFactory et par les classes AbstractProduct 49

Conséquences Isolation des classes concrètes (seules les classes abstraites sont connues) Échange facile des familles de produit Encouragement de la cohérence entre les produits Mais...prise en compte difficile de nouvelles formes de produit 50

Implantation Les fabriques sont souvent des singletons Ce sont les sous-classes concrètes qui font la création, en utilisant le plus souvent une Factory Method Si plusieurs familles sont possibles, la fabrique concrète utilise Prototype 51

Exercice Créer un système d interface graphique qui crée des widgets (objets graphiques) en fonction du système d exploitation. 52

Exercice 53

Factory Method vs Abstract Factory Factory Method Abstract Factory s appuie sur l héritage : la création des objets est déléguée aux sousclasses qui implémentent la méthode de fabrication pour créer des objets. L intention de Fabrication est de permettre à une classe de déléguer l instanciation à ses sous-classes. s appuie sur la composition : la création des objets est implémentée dans les méthodes exposées dans l interface fabrique. Fournit une interface abstraite pour créer UN produit. Fournit une interface abstraite pour créer une famille de produits Chaque sous-classe choisit quelle classe concrète instancier Chaque sous-classe concrète crée une famille de produits L intention de Fabrique Abstraite est de créer des familles d objets apparentés sans avoir à dépendre de leurs classes concrètes. 54