La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Schéma de conception Factory Method Exemple Sylvain Giroux.

Présentations similaires


Présentation au sujet: "Schéma de conception Factory Method Exemple Sylvain Giroux."— Transcription de la présentation:

1 Schéma de conception Factory Method Exemple Sylvain Giroux

2 Problème  Tout programme doit pouvoir rapporter les erreurs ou encore afficher des messages servant pour le déverminage. 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 ); }

3 Première version  Écrire une classe SystemTrace qui implémente Trace.  Les instances de cette classe affiche le résultat dans la fenêtre de commande en ligne.

4 La classe SystemTrace public class SystemTrace implements Trace { private boolean debug; public void setDebug( boolean debug ) { this.debug = debug; } public void debug( String message ) { if( debug ) { 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 ); } } // 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 ); } public void error( String message ) { // always print out errors System.out.println( "ERROR: " + message ); }}

5 Utilisation de SystemTrace  Ajouter les instructions de déverminage nécessaires pour tracer sur la console chacun des appels de méthodes d’une classe.  Ajouter les instructions de déverminage nécessaires pour tracer sur la console chacun des appels de méthodes d’une classe. class SomeClass { class SomeClass { //... some code... SystemTrace log = new SystemTrace(); //... some code... SystemTrace log = new SystemTrace(); //... code... //... code... log.setDebug(true); log.setDebug(true); log.debug( "entering log" ); log.debug( "entering log" ); //... etc... //... etc... void getValue(){ void getValue(){ log.debug( "entering getValue" ); log.debug( "entering getValue" ); //... etc... //... etc...

6 Écrire une classe FileTrace qui implémente Trace. Les instances de cette classe affiche le résultat dans un fichier. public class FileTrace implements Trace { private java.io.PrintWriter pw; private boolean debug; public FileTrace() throws java.io.IOException { String fileName = "c:\trace.log" ; pw = new java.io.PrintWriter( new java.io.FileWriter(fileName )); } 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(); } } pw = new java.io.PrintWriter( new java.io.FileWriter(fileName )); } 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(); } public void error( String message ) { // always print out errors pw.println( "ERROR: " + message ); pw.flush(); }}

7 Paramétrer le programme  Le nom de ce fichier sera spécifié dans les propriétés du programme et chargé dans une instance de ProgramProperties.  Le nom de ce fichier sera spécifié dans les propriétés du programme et chargé dans une instance de ProgramProperties.  Cette instance sera un Singleton créé à sa première utilisation. Cette classe sera sous-classe de java.util.Properties.

8 /* public class ProgramProperties extends Properties { final static public String DEFAULT_FILE_NAME = "defaultProperties"; final static public String DEFAULT_FILE_NAME = "defaultProperties"; final static public String PROPS_FILE_NAME = "ex4.properties"; final static public String PROPS_FILE_NAME = "ex4.properties"; static private ProgramProperties instance__; static private ProgramProperties instance__; static synchronized public ProgramProperties getInstance() { static synchronized public ProgramProperties getInstance() { if (instance__ == null) { if (instance__ == null) { // create and load default properties // create and load default properties ProgramProperties defaultProps = new ProgramProperties(); ProgramProperties defaultProps = new ProgramProperties(); FileInputStream in; FileInputStream in; try { try { in = new FileInputStream(DEFAULT_FILE_NAME); in = new FileInputStream(DEFAULT_FILE_NAME); defaultProps.load(in); defaultProps.load(in); in.close(); in.close(); } catch (FileNotFoundException e2) {e2.printStackTrace(); catch (FileNotFoundException e2) {e2.printStackTrace(); } catch (IOException e3) {e3.printStackTrace(); catch (IOException e3) {e3.printStackTrace(); }

9 // create program properties with default // create program properties with default ProgramProperties applicationProps; ProgramProperties applicationProps; applicationProps = new ProgramProperties(defaultProps); applicationProps = new ProgramProperties(defaultProps); try { try { // now load properties from last invocation // now load properties from last invocation in = new FileInputStream(PROPS_FILE_NAME); in = new FileInputStream(PROPS_FILE_NAME); applicationProps.load(in); applicationProps.load(in); try { try { in.close(); in.close(); } catch (FileNotFoundException e) {e.printStackTrace(); catch (FileNotFoundException e) {e.printStackTrace(); } } catch (IOException e1) { e1.printStackTrace(); catch (IOException e1) { e1.printStackTrace(); } instance__ = applicationProps; instance__ = applicationProps; } // end if (instance__ == null) } // end if (instance__ == null) return instance__; return instance__; } private ProgramProperties(ProgramProperties defaultProps){ private ProgramProperties(ProgramProperties defaultProps){ super(defaultProps); super(defaultProps); }}

10 public FileTrace() throws java.io.IOException { public FileTrace() throws java.io.IOException { ProgramProperties props = ProgramProperties.getInstance(); ProgramProperties props = ProgramProperties.getInstance(); props.getProperty(FILE_NAME_PROPERTY, props.getProperty(FILE_NAME_PROPERTY, FILE_NAME_PROPERTY_DEFAULT ); FILE_NAME_PROPERTY_DEFAULT ); _pw = new PrintWriter( new FileWriter( getFileName() ) ); _pw = new PrintWriter( new FileWriter( getFileName() ) );}

11  Pour utiliser FileTrace au lieu de SystemTrace  il faut modifier le programme en plusieurs endroits dans plusieurs classes  Afin de rassembler la création du système de trace en un seul endroit,  écrire une classe TraceFactory possédant une méthode « factory » abstraite getTrace()

12 public abstract class TraceFactory { static private TraceFactory instance__; static private TraceFactory instance__; static synchronized public TraceFactory getInstance() { static synchronized public TraceFactory getInstance() { if (instance__ == null) if (instance__ == null) instance__ = createFactory(); instance__ = createFactory(); return instance__; return instance__; } private static TraceFactory createFactory() { private static TraceFactory createFactory() { ProgramProperties props = ProgramProperties.getInstance(); ProgramProperties props = ProgramProperties.getInstance(); if (getProperty("trace.file") != null) if (getProperty("trace.file") != null) return new FileTraceFactory(); return new FileTraceFactory(); return new SystemTraceFactory(); return new SystemTraceFactory(); } public abstract Trace getTrace(); public abstract Trace getTrace();}

13 Le if n’est pas très élégant, ni flexible private static TraceFactory createFactory () { private static TraceFactory createFactory () { ProgramProperties props; String FactoryClassName; ProgramProperties props; String FactoryClassName; TraceFactory factory; TraceFactory factory; props = ProgramProperties.getInstance(); props = ProgramProperties.getInstance(); FactoryClassName = props.getProperty("trace.factory", FactoryClassName = props.getProperty("trace.factory", "SystemTraceFactory"); "SystemTraceFactory"); factory = new SystemTraceFactory(); // valeur par défaut factory = new SystemTraceFactory(); // valeur par défaut try { try { factory = (TraceFactory) factory = (TraceFactory) Class.forName(FactoryClassName).newInstance(); Class.forName(FactoryClassName).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return factory; return factory; }

14 public class SystemTraceFactory extends TraceFactory { public Trace getTrace() { public Trace getTrace() { return new SystemTrace(); return new SystemTrace(); }} public class FileTraceFactory extends TraceFactory { public Trace getTrace() { public Trace getTrace() { try { try { return new FileTrace(); return new FileTrace(); } catch (IOException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // pour au moins rendre de quoi faire la trace // pour au moins rendre de quoi faire la trace return new SystemTrace(); return new SystemTrace(); }}


Télécharger ppt "Schéma de conception Factory Method Exemple Sylvain Giroux."

Présentations similaires


Annonces Google