Design Patterns : Création (Première Partie)¶
Fabrique (Factory Method, Virtual Constructor)¶
Intention¶
Définir une interface pour créer un objet, mais laisser les sous-classes décider quelle classe doit être instanciée. La fabrique permet à une classe de transférer la responsabilité de créer des objets aux sous-classes.
Mise en contexte¶
Application de dessin, avec la possibilité de dessiner au moins 2 types
d’images, des images sur un Canvas (voir ShapesLib), ou des images de type
AsciiArt. On peut dessiner des figures géométriques sur ces images.
Détails¶
- Menu principal
- Nouveau document
- Canvas
- Ascii Art
- Ouvrir
- Fermer
- Sauvegarder
- Nouveau document
- L’application doit créer soit une
CanvasApp, soit uneAsciiApp - Chaque app doit créer un document du bon type,
CanvasDocouAsciiDoc - La méthode
CreateDocumentest abstraite parce que le type de document créé va dépendre du type d’image choisie- donc le menu principal doit créer le bon type d’application, mais le reste
du code de l’interface graphique va travailler avec les classes
abstraites
ApplicationetDocument, sans connaitre le type exact d’image - si ce n’était pas le cas, il faudrait faire des
if ... else ...ou desswitchpartout sur le type d’image pour utiliser les bonnes classes - en utilisant les classe abstraites, cela permet de faire bon usage du polymorphisme
- donc le menu principal doit créer le bon type d’application, mais le reste
du code de l’interface graphique va travailler avec les classes
abstraites
Fabrique Abstraite (Abstract Factory, Kit)¶
Intention¶
Donner une interface pour créer une famille d’objets semblables ou dépendants sans spécifier leur classe concrète.
Mise en contexte¶
Continuation de l’exemple précédent. Pour créer les figures géométriques
(les Shapes), doit-on créer les versions CanvasApp ou AsciiApp ? Il faut
éviter de faire des if ... else ... ou des switch partout.
Détails¶
- Bouton pour créer une ligne (ou un cercle ou un rectangle…) :
- a-t-on besoin d’un
ifpour savoir quel objet créer exactement ? - une ligne sur un
Canvasou une ligneAscii?
- a-t-on besoin d’un
- Il faut créer 2
ShapeFactory, avec des méthodes pour chaque type deShape CanvasAppva créer uneCanvasShapeFactoryAsciiAppva créer uneAsciiShapeFactory- La classe abstraite
ShapeFactoryva être utilisée au niveau de la classeApplication - Chaque application va avoir une méthode (ou peut-être une propriété) de
type
ShapeFactory
App.ShapeFactory.createLine()va retourner une nouvelle ligne, de typeCanvasouAscii, selon la sous-classe utilisée au moment de la création- ce code sera utilisé, par exemple, dans le
onClick(ou autre gestionnaire d’évènement) d’un bouton, ou d’un item de menu, ou d’un raccourci clavier, …