Schéma de conception Factory Method Exemple Sylvain Giroux.

Slides:



Advertisements
Présentations similaires
Introduction Fonctionnement PluginsConfigurationLes données Le framework MAG Framework de conception de canaux complexes Implémente IChannel Possède son.
Advertisements

Sérialisation des objets
Le mécanisme des exceptions
Introspection et Réflexion Manipulation dynamique de code Java.
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Java et la réflexivité. Java reflection is useful because it supports dynamic retrieval of information about classes and data structures by name, and.
TP 7.1 synchronized et join Écrire un programme Java qui crée 1000 threads et maintient un compteur nb du nombre de threads créés jusque-là. Le thread.
Programmation Web Les JSP.
Plan du cours La sérialisation: – comment stocker et restaurer les Objets? Les interfaces graphiques et la programmation évènementielle. –Comment concevoir.
Les technologies XML Cours 3 : Les APIS XML Janvier Version 1.0 -
Programmer en JAVA par Tama
Packages et résolution de noms
Tarak Chaari, Stéphane Frénot, Frédérique Laforest, Frédéric Le-Mouël JAV1 JAV – TD 5 Lhéritage en Java.
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
1 Le mécanisme des exceptions Qu'est-ce qu'une exception? Comment définir et signaler des exceptions? Comment récupérer des exceptions?
بسم الله الرحمن الرحيم. Institut Supérieure des Etudes Technologiques de Kébili.
Présentation JAXB et STRUTS²
Chapitre IV Object, interfaces, classes imbriquées.
Traitement des erreurs en Java
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
COURS DE PROGRAMMATION ORIENTEE OBJET :
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Écouteurs de click d'une fenêtre
Langage Oriente Objet Cours 4.
POO-L3 H. Fauconnier1 C) Méthodes: Redéfinition Un classe hérite des méthodes des classes ancêtres Elle peut ajouter de nouvelles méthodes Elle peut surcharger.
JDBC ou comment manipuler une base de données en Java ?
Java Héritage, interfaces.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Langage Oriente Objet Cours 3.
Classes abstraites et Interfaces
Factory Design Patterns Factory Method
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
POO-L3 H. Fauconnier1 Supplément gratuit…. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double.
Design Pattern: Decorator
1 Les paquetages («packages»). 2 L'objectif avec les paquetages («packages») est de rendre accessibles aux utilisateurs des classes définies par d'autres.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
COURS DE PROGRAMMATION ORIENTEE OBJET :
Proxy et plus Cnam Paris jean-michel Douin, douin au cnam point fr
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
1111 Gestion des exceptions Objectifs À la fin de ce cours, vous serez capables de : • Expliquer les concepts de base de la gestion des exceptions.
1212 Entrée et sortie de fichiers Objectifs À la fin de ce cours, vous serez capables de : • Lire à partir de la console • Écrire sur la console.
J201 (JOC) Java Avancé juin 2007 ~ Brigitte Groléas ~
1 Fichers Binaires, Accès Direct et Objets. 2 Données binaires. Il s'agit ici de lire et écrire des données binaires par opposition à du texte. Pour ce.
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
Cours n°3 rappels. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double a = 5.6d ; double b =
Propriétés. Propriétés ► Les propriétés peuvent être visibles dans les environnements de scripts ► Les propriétés peuvent être accédées par programmation.
Factory Design Patterns. Contents Factory patterns: principesFactory patterns: principes The Factory Method patternThe Factory Method pattern The Abstract.
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
Java : Exceptions H Batatia. 5/03/2004Java12: H.Batatia2 Exemple 1 public class Bonjour { public static void main(String[] args) { System.out.println("Bonjour.
11/04/ L'héritage Cours 7 Cours 7.
Cours 7 Classes locales Clonage Divers: tableaux.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 6 – Exceptions.
Créer des packages.
Cours Les flux ou streams. Cours 162 Flux : objet possédant des méthodes capables de lire ou écrire des flots d’octets sur tout support (mémoire,
CEG3585/CEG3555 Tutorat 2 Hi ver 2013.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
Tutorat en bio-informatique
12/04/ Les exceptions Cours 11 Cours 11.
Entrées / Sorties.
Les sockets.
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Cours du 5 novembre.
PHP5 objet "avancé" Jérôme CUTRONA 09:56:48 Programmation Web
Schéma de concpetion Abstract Factory Exemple Sylvain Giroux.
1 Chapitre III (~70 transparents) Compléments. 2 Au sommaire de ce chapitre 1. Les fichiers Les classes utilitaires
Héritage Conception par Objet et programmation Java
Traitement des erreurs en Java: les exceptions
Schéma de conception Factory Method Exemple
Transcription de la présentation:

Schéma de conception Factory Method Exemple Sylvain Giroux

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 ); }

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.

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 ); }}

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...

É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(); }}

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.

/* 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(); }

// 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); }}

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() ) );}

 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()

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();}

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; }

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(); }}