Chapitre3 GoF Creation
Chapitre3 GoF Creation
GANG OF FOUR
Gang des 4
2
L’usage montre que certains patterns sont plus utilisés que d’autres.
Selon le livre DP-Tête la Premère les 14 patterns les plus populaires sont ceux mis en
gras sur le tableau.
Eléments essentiels des patrons
5
Nom du patron
Problème (Applicabilité)
¤ Quel est le problème et le contexte pour lesquels nous utiliserions ce
patron?
¤ Quelles sont les conditions pour l'utilisation de ce patron?
Solution (Structure)
¤ Une description des éléments constituant le patron de conception
Conséquences
¤ Le pour et le contre de l'utilisation du patron
¤ Les impacts sur la réutilisabilité, la portabilité et l'extensibilité
PATRONS DE CRÉATION
Patrons de Création
7
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)
PATRONS DE CRÉATION
Factory Method (Fabrication/Usine)
Instanciation au moment de l’exécution
9
Client
PizzaFromage PizzaPoivrons
La méthode de création"
est souvent déclarée" PizzaFruitsDeMer PizzaGrecque
PizzaVegetarienne
statique"
Produit Concret
Pizza
Pizzeria
PizzaFromage PizzaPoivrons
PizzeriaAlgerienne PizzeriaItalienne
PizzaVegetarienneIt PizzaFruitsDeMer
PizzaVegetarienneAlg
PizzaGrecque
Déclarer une méthode de fabrique
15
[Link](); if ([Link](“fromage”)) {
Créateur Produit
Pizzeria
commanderPizza() Pizza
abstract creerPizza()
PizzaPoivrons
PizzaFromage
PizzeriaAlgerienne PizzeriaItalienne
creerPizza() creerPizza() PizzaVegetarienneIt PizzaFruitsDeMer
Produit Concret
Le pattern Fabrication (Factory Method) définit une interface pour la création d’un
objet, mais en laissant aux sous-classes le choix des classes à instancier. Elle permet
à une classe de déléguer l’instanciation à des sous-classes.
Description du pattern Factory Method
17
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
Participants
¤ Product : définit l’interface des objets créés par la
fabrication
¤ ConcreteProduct : implémente l’interface Product
ApControl
afficherDessin()
ImprimerDessin()
Construit et instancie des
Pilotes BR et les assignes aux
méthodes afficher et Imprimer"
BasResApControl HautResApControl
ApControl
PiloteAffichage PiloteImpression
class ApControl { }
…. void ImprimerDessin () {
PiloteAffichage monPiloteAff; …
PiloteImpression monPiloteImp; [Link]();
}
void afficherDessin () { } créer ces objets
Comment
… selon les deux familles?"
[Link]();
Encapsuler la création d’objet
28
a la responsabilité de savoir Client"
comment travailler avec les " ApControl
objets appropriés"
PiloteAffichage PiloteImpression
Produit"
a la responsabilité de
déterminer quels objets sont Fabrique Abstraite"
appropriés, les créer" ResFact
CreerPA():PiloteAffichage
CreerPI():PiloteImpression
Fabrique Concrète"
BasResFact HautResFact
Le pattern Fabrique Abstraite fournit une interface pour créer des familles d’objets apparentés ou
dépendants sans avoir à spécifier leurs classes concrètes
Encapsuler la création d’objet
29
}
Abstract Factory
30
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.
Abstract Factory
31
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
Abstract Factory
32
Solution
Abstract Factory
33
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
Exemple
34
Fournit une interface abstraite pour créer Fournit une interface abstraite pour créer
UN produit." une famille de produits"
Chaque sous-classe choisit quelle classe Chaque sous-classe concrète crée une
concrète instancier" famille de produits"
Intention
¤ S’assurer qu’une classe a une seule instance, et fournir un
point d’accès global à celle-ci.
¤ Variable globale « améliorée »
Utilisations connus
¤ Un seul window manager, un seul point d’accès à une base
de donnée, DefaultToolkit en AWT/Java, etc.
Patterns associés
¤ Abstract Factory, Builder, Prototype
Singleton
43
Problème
¤ Il est souvent important pour une classe de n’avoir qu’une
instance qui doit être accessible de manière connue
(facilement accessible).
Solution:
¤ Assurer une instance unique en cachant le mécanisme de création
(constructeur privé en Java)
¤ Garder une référence pour l’instance unique (attribut statique privé)
¤ Créer un point d’accès publique (une méthode qui retourne l’instance
unique)
private Singleton () {}
Accès contrôlé
Pas de variable globale
Permet la spécialisation des opérations et de la
représentation
Permet un nombre variable d’instances (variante de
Singleton)
Plus flexible que les méthodes de classe
Implémentation
46
Assurer l’unicité
¤ Remarque : En Java la méthode « Clone » de la classe Object permet de
cloner l’instance créée. Pour garantir l’unicité, une solution est de redéfinir
cette méthode de sorte qu’elle retourne « this » (l’instance unique créée).
Application « multithread »
Si le singleton n’a pas d’état, cela ne devrait pas être un problème
Préférer une instance créée au démarrage (lors de la déclaration de
l’attribut) à une instance créée à la demande
Verrouillage à double tour : Variante du pattern Singleton
Effectuer une synchronisation après le test de la valeur de l’instance et
avant sa création
public class Singleton {
private static Singleton instance;
private Singleton () {…}
private synchronized static void effectuerSync() {
if (instance==null) instance= new Singleton ();
}
public static Singleton getInstance() {
if (instance==null) effectuerSync();
return instance;
}
}
Exercice
48
Le Pattern Builder
permet d’ encapsuler
la construction d’un
produit complexe et le
construire par étapes
52
Pattern Builder
Intention
¤ Séparer la construction d’un objet complexe de sa représentation de
façon à pouvoir construire différentes représentations à partir d’un
même processus de création.
Utilisations connues
¤ Utilisé par les parser, création de graphe, création d’un menu..
Synonymes
¤ Monteur, Fabrique concrète
Patrons associés
¤ Un Builder est en général un Singleton
¤ Abstract factory est souvent similaire mais la démarche est
différente
¤ Le produit généré est souvent un Composite
53
Builder
Problème
¤ l'algorithme pour créer un objet doit être indépendant des
parties qui le compose et de la façon de les assembler
¤ le processus de construction permet différentes représentations
de l'objet construit
Solution
Builder: Participants
54
Builder
¤ Spécifie une interface abstraite afin de créer les parties d’un objet Produit.
BuilderConcret
¤ Construit et assemble les pièces du produit en implémentant l’interface Builder.
¤ Définit et garde une trace de la représentation qu’il crée.
¤ Fournit une interface pour retrouver le produit
Director
¤ Construit un objet en utilisant l’interface Builder.
Produit
¤ Représente l’objet complexe en construction. BuilderConcret construit la
représentation interne du produit et définit le processus par lequel il est assemblé.
¤ Comprend les classes qui définissent les éléments constitutifs, y compris les
interfaces pour l’assemblage des pièces en un résultat final.
55
Exemple réel
La classe String (de [Link]) modélise les chaînes
de caractères, qui ne sont pas modifiables.
La classe StringBuilder sert de bâtisseur pour les
!
TexConverter! !
AsciiConverter! !
HTMLConverter!
! ! !
! ! !
ConvertCharacter()! ConvertCharacter()! ConvertCharacter()!
ConvertFontChange! ConvertFontChange! ConvertFontChange!
ConvertParagraph()! ConvertParagraph()! ConvertParagraph()!
GetASCIIText()! GetASCIIText()! GetASCIIText()!
Staff MusicalNote
RotateTool GraphicTool
Manipulate() Manipulate()
WholeNote HalfNote
Create instance of
graphical object.
Add the newly
created instance
into editor
Solution1
65
Tool Graphic
Manipulate()
Staff MusicalNote
RotateTool GraphicTool
Manipulate() Manipulate()
WholeNote HalfNote
StaffGraphicTool WholeNoteGraphicTool
Manipulate() Manipulate()
Staff MusicalNote
RotateTool GraphicTool Draw(Position)
Clone()
Manipulate() Manipulate()
WholeNote HalfNote
p = prototype->Clone() Draw(Position) Draw(Position)
While (user drags mouse){ Clone() Clone()
p->Draw(New Position)
}
insert p into drawing Return copy to self Return copy to self
Si toutes les sous-classes graphiques prennent en charge une opération de clonage, alors la
Staff MusicalNote
RotateTool GraphicTool Draw(Position) Draw(Position)
Clone() Clone()
Manipulate() Manipulate()
Intention
¤ Spécifie le type des objets à créer à partir d’une instance (le
prototype), et crée de nouveaux objets en copiant ce prototype
(clonage).
Utilisations connues
¤ Prototypes de matériels informatiques, éditeurs (ex. UML, etc.),
gestion des monstres dans les jeux vidéos, Simulation de la
division cellulaire, ..
Synonymes :
¤ clone, objet type
Patrons en relation
¤ Abstract Factory, Composite, Decorator
Prototype
70
Problèmes
¤ Si les instances d'une classe peuvent prendre un état
parmi un ensemble de configurations (=prototypes).
C'est souvent le cas pour des composites.
¤ Pour limiter le nombre de sous-classes, une par
Problèmes
¤ Quand la classe à instancier n'est connue qu’à l’exécution
¤ Quand la création d’une instance d’une classe donnée est
coûteuse ou compliquée
¤ Quand un système doit être indépendant de la façon dont ses
produits sont créés, imposées, et représentés.
■ Un outil générique manipule certains objets spécifiques à
un(e) domaine (application)
¤ Quand des types de produits (configurations) doivent pouvoir
être créées (ou ajoutées) par l’utilisateur
■ Prototype offre d'une certaine façon des capacités de
programmation à l'utilisateur lui-même (« programmation
dynamique de classes »)
72
Prototype
Solution
bvbvbv
73
Participants
Prototype
Déclare une interface pour se “cloner”
ConcretePrototype
Client
Get(“red wall”)
Record YellowWallObj
“yellow wall”
X <- find(name_obj);
Return [Link]();
77
Récapitulatif
On utilise le pattern Abstract Factory :
¤ Quand on doit créer une famille d'objets qui se ressemblent.
¤ Quand les objets d'une famille peuvent évoluer.