IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Logging Java Discussion :

Design Pattern en java


Sujet :

Logging Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 85
    Points : 55
    Points
    55
    Par défaut Design Pattern en java
    Bonjour,

    je souhaite créer un chargement dynamique de mes objets au runtime. Je dispose de deux classes de bases dont héritent différentes classes.
    JE souhaite définir une méthode "factory" qui me permettent de donner de la modularité à mon code. C'est a dire que pour rajouter une nouvelle classe dérivant d'une classe de base, je devrais juste écrire un .java pour implénter ma classe mais sans toucher au code propre à la factory.

    Je sais faire ca en C++ mais je suis assez nouveau en Java donc si qqn peut m'aider

    Merci

    Xavier

  2. #2
    Membre du Club

    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    Moi je veux bien t'aider, mais si tu ne nous dit pas avec précisions (genre un exemple) ce qui ne vas pas, je doute que bcp de gens puisse t'aider...

    As-tu regarder dans les tutos présent sur le site? Il me semble, de souvenir fort vague, qu'il y a un article qui parle de factory...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 85
    Points : 55
    Points
    55
    Par défaut
    je vais expliquer plus en détails:

    j'ai une classe de base Solveur et j'ai deux classes Simmetrix et Samcef qui dérivent de Solveur
    Puis j'ai aussi une classe de base Analysis et Static et Fracture sont des classes dérivées de Analysis.


    J'ai une factory qui me permet d'instancier soit un objet Samcef soit un objet
    Simmetrix.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Factory {
        public Factory()  {
        }
     
        public Solver getSolver(String s) {
            if (s=="Simmetrix")
                return new Simmetrix(s);
           else if(s=="Samcef") 
                 return new Samcef(s);
        }
    }
    Mais j'aimerais avoir une factory qui me permette via des mots clés, d'instancier des objets Samcef, Simmetrix, Static, Fracture.

    Je ne trouve pas comment faire cette factory capable d'instancier des objets de classes dérivant de classes de base différentes à l'aide de mots clés.

    J'espère que j'ai été clair mais c difficile à expliquer comme ca.

    Merci

    Xavier


    Edité par Lunatix : merci de penser aux balises CODE

  4. #4
    Membre du Club

    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    Si je comprend bien, tu voudrais que ton Factory retourne autre chose que des Solver en fonction du parametre ? Que ce soit des Solver ou des Analysis?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 85
    Points : 55
    Points
    55
    Par défaut
    Oui voila, comme ca je peux ajouter des nouvelles classes dérivant des classes de base Solveur et Analysis sans toucher au code de la factory.


    Le paramètre serait une string que j'irai lire dans des fichiers texte:

    si le mot clés "Simmetrix" apparait alors je dois instancier un solveur de type Simmetrix. De plus si un utilisateur veut rajouter un solveur il ne devrait que
    coder la classe NewSolver extends Solver et définir le mot clés "newsolver" comme paramètre permettant d'instancier un objet de type NewSolver.

    Voila je pense que ca explique un peu plus le mécanisme que je veux mettre en place.

    Merci,

    Xavier

  6. #6
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class maClasse = Class.forName(nomClasse);
    if (!TaSuperClasse.class.isAssignableFrom(maClasse));
        throw new Exception ("La classe n'implemente pas TaSuperClasse");
     
    //si constructeur sans arguments
    TaSuperClasse obj = (TaSuperClasse)maClass.new Instance();
    //sinon
    TaSuperClasse obj = (TaSuperClasse)maClasse.getConstructor(tableauDeTypesDArguments).newInstance(tableauDArguments);

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Je pense que tu as tapé ton code ici comme exemple, mais il y a deux problèmes :
    • 1. Il ne peux pas compiler car dans un cas il ne renvoit pas de valeur.
      2. Les comparaisons de String se font avec la méthode equals() et non pas == !


    Maintenant si j'ai bien compris tu veux que la méthode getSolver() soit générique et marche quelque soit la valeur passé en paramètre (a condition qu'elle corresponde à un objet implémentant Solver).


    Il te suffit d'utiliser l'API de reflection et d'utiliser les noms complets des classes (package + nom) en paramètres de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class Factory {
    	public Solver getSolver(String className) throws Exception {
     
    		// On récupère l'objet représentant la classe :
    		Class pClass = Class.forName(className);
    			// throw ClassNotFoundException
     
    		// On instancie une nouvelle instance :
    		Object instance = pClass.newInstance();
    			// throw InstantiationException, IllegalAccessException
     
    		// Si l'instance crée n'est pas une instance de Solver
    		if ( !(instance instanceof Solver) ) {
    			throw new Exception ("La classe n'implemente pas Solver");
    		}
    		return (Solver) instance;
    	}
    }
    Je n'ai pas géré les exception à toi de le faire...

    a++

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 85
    Points : 55
    Points
    55
    Par défaut
    public class Factory {
    public Solver getObject (String className) throws Exception {

    // On récupère l'objet représentant la classe :
    Class pClass = Class.forName(className);
    // throw ClassNotFoundException

    // On instancie une nouvelle instance :
    Object instance = pClass.newInstance();
    // throw InstantiationException, IllegalAccessException

    // Si l'instance crée n'est pas une instance de Solver
    if ( !(instance instanceof Solver) ) {
    throw new Exception ("La classe n'implemente pas Solver");
    }
    return (Solver) instance;
    }
    }


    mais ici l'objet que je récupère est une instance de la classe Solver. Or je veux pouvoir avec cette factory créer des instances de la classe Analysis:

    J'ai une classe Fracture extends Analysis et Static extends Analysis et dans ces deux classes j'ai une méthode RUN() et je veux faire qqch du style:

    Object object = getObject("fracture");
    object.RUN(); --> appel la méthode RUN de la classe fracture

    or avec ce que tu m'as donné, on obtient en retour une Instance de la classe Solver donc ca va pas.

    Merci,

    Xavier
    [/b]

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 274
    Points : 307
    Points
    307
    Par défaut
    Bonjour,

    n'oublie pas que toutes les classes java ont une classe mère "Object"

  10. #10
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Class maClasse = Class.forName(nomClasse);
     
    if (Solver.class.isAssignableFrom(maClasse) || Analysis.class.isAssignableFrom(maClasse) || ...) {
        //si constructeur sans arguments
        return maClass.new Instance();
        //sinon
        return maClasse.getConstructor(tableauDeTypesDArguments).newInstance(tableauDArguments);
    }
    else
        throw new Exception ("...");
    Tu ne pourras pas faire ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Object object = getObject("fracture");
    object.RUN(); --> appel la méthode RUN de la classe fracture
    utilise plutot ce genre de choses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Analysis  object = (Analysis)getObject("fracture");
    object.RUN(); --> appel la méthode RUN de la classe fracture

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mencaglia
    or avec ce que tu m'as donné, on obtient en retour une Instance de la classe Solver donc ca va pas.
    Si Solver et Analysis sont deux classes totalement différents alors tu es obligé de retrouné un Object...

    Par contre je ne vois pas trop l'intérêt si il n'y a aucune interface commune car il te faudra ensuite faire plusieurs cast et instanceof pour sécuriser ton code...

    a++

  12. #12
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    Citation Envoyé par adiGuba
    Citation Envoyé par mencaglia
    or avec ce que tu m'as donné, on obtient en retour une Instance de la classe Solver donc ca va pas.
    Si Solver et Analysis sont deux classes totalement différents alors tu es obligé de retrouné un Object...
    Vrai. Pas d'interface commune ? Pas de super classe commune ?

    Citation Envoyé par adiGuba
    Par contre je ne vois pas trop l'intérêt si il n'y a aucune interface commune car il te faudra ensuite faire plusieurs cast et instanceof pour sécuriser ton code...
    Autre solution, il faut typer un peu plus fortement les méthodes de ta factory.
    Exemple :
    - 1 méthode public Solver getSolver(String arg)
    - 1 méthode public Analysis getAnalysis(String arg)

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 85
    Points : 55
    Points
    55
    Par défaut
    dans mon main j'ai ceci:


    public static void main(String[] args) {
    System.out.println("start main");

    Factory factory = new Factory();
    Solver object = (Solver)factory.getSolver("Simmetrix");
    System.out.println(object.get_type());
    System.out.println("finish main");
    }
    et il me met une exception :
    unreported exception java.lang.Exception; must be caught or declared to be thrown at line 84 (84:50)

    désolé, mais comme j'ai dis au début je suis assez novice en Java... j'ai fait que du c++ jusqu a présent,

    Si tu peux m'aider encore u peu
    merci
    Xavier

  14. #14
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static void main(String[] args) throws Exception
    Comme ca tu ne te poseras pas trop de questions pour commencer. Tu devras par contre t'interesser à la gestion des Exception par la suite.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 85
    Points : 55
    Points
    55
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static void main(String[] args)  throws Exception {
            System.out.println("start main");
           /* Simmetrix simmetrix = new Simmetrix();
            simmetrix.run();*/
            Factory factory = new Factory();
            Solver object = (Solver)factory.getSolver("Simmetrix");
          //  System.out.println(object.get_type());
            System.out.println("finish main");
        }
    j'obtient cette exception:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Exception in thread "main" java.lang.ClassNotFoundException: Simmetrix
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:199)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
    	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
    	at java.lang.Class.forName0(Native Method)
    	at java.lang.Class.forName(Class.java:141)
    	at Atelier_logiciel_fatigue.Factory.getSolver(Factory.java:32)
    	at Atelier_logiciel_fatigue.Solver.main(Solver.java:85)
    Je vais m''intéresser à la gestion des exceptions ... si tu as une idée pour cette exception car j'aimerais vérifier que la méthode que tu m'as donné correspond à mes besoins.

    merci
    Xavier

  16. #16
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    ta classe est dans un package ?
    Si oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Solver object = (Solver)factory.getSolver("tonpackage.Simmetrix");
    ou alors, tu prefixe dans la méthode getSolver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Solver getSolver(String s) {
        String className = "package."+s;
        Class classe = Class.forName(className);
        ...
    }
    par contre, le pb c'est que ca implique que tes Solver soient tous dans le meme package dans ce cas là.

    Autre solution, dans ta factory, tu initialises une HashMap de Class avec comme clé Simmetrix, ...
    Tu récuperes ta classe en faisant tamap.get("Simmetrix") et tu utilises le code qui ne change pas derrière.

  17. #17
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 572
    Points
    1 572
    Par défaut
    Bonjour,
    un petit detail dans le pattern "Factory" la methode getUnObjetSelonLesParametre est declaré "static" pour l appeler sans declarer d'instance de cette classe. Par la suite l'exeption levé est un probleme d'inclde ou de path (ce qui reviens grosso-modo au meme).

  18. #18
    Membre averti
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Points : 427
    Points
    427
    Par défaut
    Citation Envoyé par BainE
    Bonjour,
    un petit detail dans le pattern "Factory" la methode getUnObjetSelonLesParametre est declaré "static" pour l appeler sans declarer d'instance de cette classe.
    Faux. Ce que tu dis est contraire aux patterns Abstract Factory et Factory Method. Comment pourrais tu substituer une factory par une autre en utilisant des méthodes statiques ?

    Citation Envoyé par BainE
    Par la suite l'exeption levé est un probleme d'inclde ou de path (ce qui reviens grosso-modo au meme).
    Le classpath est sans doute bon mais il manque certainement le package pour que le Class.forName(...) fonctionne.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 85
    Points : 55
    Points
    55
    Par défaut
    merci pour le tuyau, j'ai rectifier l'histoire du package:
    mais quand je fais un get_type() sur mon objet Solver, j'ai en retour un type Solver or le mot clés que j'ai donné en paramètre de mon gerSolver est "Simmetrix" donc je devrais avoir un type Simmetrix.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      public static void main(String[] args)  throws Exception {
            System.out.println("start main");
            Factory factory = new Factory();
            Solver object = (Solver)factory.getSolver("Atelier_logiciel_fatigue.Simmetrix");
            [b]System.out.println(object.get_type());[/b]
            System.out.println("finish main");
    }

    si vous pouvez m'aider encore un petit peu,

    Merci
    Xavier

  20. #20
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 572
    Points
    1 572
    Par défaut
    re,
    je ne veux rien substituer du tout, mais pour moi le shéma UML est pas facile a decrire mais en decoule dans le code ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    InterfaceObjet Factory.getMonObjet( param1, param2 );
    Factory inclue l'objet mere de ceux qui peuve etre rendu par la Factory.
    Je vois rien d'impossible dans ce concepte la.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. 2 livres sur les design pattern en java : lequel prendre ?
    Par rXpCH dans le forum Général Java
    Réponses: 0
    Dernier message: 10/03/2010, 08h35
  2. [Conception] Design Pattern Observer Java
    Par jeb001 dans le forum Général Java
    Réponses: 4
    Dernier message: 02/05/2007, 23h43
  3. Meilleur livre sur les design patterns en Java?
    Par JFortranDoc dans le forum Logging
    Réponses: 5
    Dernier message: 15/06/2006, 01h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo