Factory Design Patterns Contents Factory patterns principes The

  • Slides: 13
Download presentation
Factory Design Patterns

Factory Design Patterns

Contents • Factory patterns: principes • The Factory Method pattern • The Abstract Factory

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 STRUCTURE Portée COMPORTEMENT CLASS E Factory Method Adapter

But et portée (1) Buts INSTANCIATION STRUCTURE Portée COMPORTEMENT CLASS E Factory Method Adapter Interpreter Template Method OBJET 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

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

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

Imprimer la trace d’un programme public interface Trace { // turn on and off debugging public void set. Debug( 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 File. Trace implements Trace { private

Imprimer la trace dans un fichier public class File. Trace implements Trace { private java. io. Print. Writer pw; private boolean debug; public File. Trace() throws java. io. IOException { // a real File. Trace would need to obtain the filename somewhere // for the example I'll hardcode it pw = new java. io. Print. Writer( new java. io. File. Writer( "c: trace. log" ) ); } public void set. Debug( 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 System. Trace implements Trace { private

Imprimer la trace sur la console public class System. Trace implements Trace { private boolean debug; public void set. Debug( 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. . . System.

Pour utiliser l’un ou l’autre système //. . . some code. . . System. Trace log = new System. Trace(); //. . . code. . . log. debug( "entering loog" ); //. . . etc. . . Factory Design Patterns

Factory pattern: principes (2) • Les patrons de création rendent le design • plus

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

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 (Child 1

Factory pattern: Principes (4) • La classe Factory décide de la sous-classe (Child 1 ou Child 2) qui sera instanciée Factory Design Patterns

Factory pattern: exemple public class Parent { protected String first; protected String second; …

Factory pattern: exemple public class Parent { protected String first; protected String second; … } public class Child 1 extends Parent {} public class Child 2 extends Parent {} public class Parent. Factory { public Parent get. Parent(String argument) { if (argument. equals(…)) return new Child 1(argument); else return new Child 2(argument); } } Factory Design Patterns