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
L'application doit créer soit une
CanvasApp, soit uneAsciiAppChaque app doit créer un document du bon type,
CanvasDocouAsciiDocLa méthode
CreateDocumentest abstraite parce que le type de document créé va dépendre du type d'image choisiedonc 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'imagesi ce n'était pas le cas, il faudrait faire des
if ... else ...ou desswitchpartout sur le type d'image pour utiliser les bonnes classesen utilisant les classe abstraites, cela permet de faire bon usage du polymorphisme
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?
Il faut créer 2
ShapeFactory, avec des méthodes pour chaque type deShapeCanvasAppva créer uneCanvasShapeFactoryAsciiAppva créer uneAsciiShapeFactoryLa classe abstraite
ShapeFactoryva être utilisée au niveau de la classeApplicationChaque application va avoir une méthode (ou peut-être une propriété) de type
ShapeFactoryApp.ShapeFactory.createLine()va retourner une nouvelle ligne, de typeCanvasouAscii, selon la sous-classe utilisée au moment de la créationce 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, ...