7a_IFT232_DesignPatterns_Factory_Principes

publicité
Factory Design Patterns
Contents
• Factory patterns: principes
• The Factory Method pattern
• The Abstract Factory pattern
“Design patterns are recurring solutions to design problems
you see over and over.”
[Smalltalk Companion]
Factory Design Patterns
But et portée (1)
Buts
INSTANCIATION
Portée
CLASSE
OBJET
STRUCTURE
COMPORTEMENT
Factory Method
Adapter
Interpreter
Template Method
Abstract Factory
Builder
Prototype
Singleton
Adapter
Bridge
Composite
Decorator
Facade
Proxy
Chain of Responsibility
Command
Iterator
Mediator
Memento
Flyweight
Observer
State
Strategy
Visitor
But: que fait un patron ?
• Les patrons d’instanciation s’intéressent au processus de création d’objets
Portée : à quel niveau s’applique un patron? Au niveau des classes ou des objets?
Factory Design Patterns
But et portée (2)
• Les patrons au niveau des classes s’occupent des relations entre les
classes et les sous-classes. Ces relations sont fixées statiquement à la
compilation.
• Les patrons de création au niveau des classes délèguent une partie de
la création des objets aux sous-classes.
• Les patrons au niveau des objets s’occupent des relations entre les
objets, lesquels sont plus dynamiques et peuvent être modifiées à
l’exécution
• Les patrons de création au niveau des objets délèguent la création à
d’autres objets.
• Les patrons de “factory” permettent de configurer un système avec des
objets qui peuvent varier notablement en termes de structure et de
fonctions
Factory Design Patterns
Factory pattern: principes (1)
• La création d’objets avec des comportements
spécifiques demande plus que la simple instanciation
d’une classe
• La plus grande barrière au changement réside dans
l’encodage direct (“hard-coding”) des classes qui
peuvent être instanciées
• Encoder directement un nombre fixe de comportements
Définir un plus petit ensemble de comportements
fondamentaux qui peuvent être composés
Factory Design Patterns
Imprimer la trace d’un programme
public interface Trace {
// turn on and off debugging
public void setDebug( boolean debug );
// write out a debug message
public void debug( String message );
// write out an error message
public void error( String message );
}
Factory Design Patterns
Imprimer la trace dans un fichier
public class FileTrace implements Trace {
private java.io.PrintWriter pw;
private boolean debug;
public FileTrace() throws java.io.IOException {
// a real FileTrace would need to obtain the filename somewhere
// for the example I'll hardcode it
pw = new java.io.PrintWriter(
new java.io.FileWriter( "c:\trace.log" ) );
}
public void setDebug( boolean debug ) {
this.debug = debug;
}
}
public void debug( String message ) {
if( debug ) { // only print if debug is true
pw.println( "DEBUG: " + message );
pw.flush();
}
}
public void error( String message ) {
// always print out errors
pw.println( "ERROR: " + message );
pw.flush();
}
Factory Design Patterns
Imprimer la trace sur la console
public class SystemTrace implements Trace {
private boolean debug;
public void setDebug( boolean debug ) {
this.debug = debug;
}
public void debug( String message ) {
if( debug ) {
//only print if debug is true
System.out.println( "DEBUG: " + message);
}
}
}
public void error( String message ) {
// always print out errors
System.out.println( "ERROR: " + message );
}
Factory Design Patterns
Pour utiliser l’un ou l’autre système
//... some code ...
SystemTrace log = new SystemTrace();
//... code ...
log.debug( "entering loog" );
// ... etc ...
Factory Design Patterns
Factory pattern: principes (2)
• Les patrons de création rendent le design
• plus flexible
• pas nécessairement plus petit
• Les patrons de création fournissent diverses manières
• de supprimer les références explicites aux classes concrètes
• dans la partie du code où doit se faire l’instanciation
Factory Design Patterns
Factory pattern: Principes (3)
• Créer une abstraction qui décide quelle classe, parmi celles
qui sont acceptables, il faut rendre.
• Par la suite, il suffit d’invoquer les méthodes de l’instance de
cette classe sans connaître de quelle classe il s’agit exactement.
• Un patron simple de “factory” rend une instance d’une des
nombreuses classes acceptables en fonction des données
qui lui sont fournies.
• En général,
• toutes les classes qui sont rendues possèdent un ancêtre
commun et des méthodes communes,
• toutefois chacune accomplit ses tâches différemment et est
optimisée pour différentes sortes de données
Factory Design Patterns
Factory pattern: Principes (4)
•
La classe Factory décide de la sous-classe (Child1 ou Child2) qui sera
instanciée
Factory Design Patterns
Factory pattern: exemple
public class Parent
{
protected String first;
protected String second;
…
}
public class Child1 extends Parent {}
public class Child2 extends Parent {}
public class ParentFactory {
public Parent getParent(String argument)
{
if (argument.equals(…))
return new Child1(argument);
else
return new Child2(argument);
} }
Factory Design Patterns
Téléchargement