You are on page 1of 13

Factory Design Patterns

Content
s
• 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 STRUCTURE COMPORTEMENT
Portée Factory Method Adapter Interpreter
CLASSE Template Method
OBJET Abstract Factory Adapter Chain of Responsibility
Builder Bridge Command
Prototype Composite Iterator
Singleton Decorator Mediator
Facade Memento
Proxy 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

You might also like