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

Java Discussion :

Pattern abstract factory : besoin de conseils !


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 24
    Points : 19
    Points
    19
    Par défaut Pattern abstract factory : besoin de conseils !
    Bonsoir,

    Je suis sur un petit projet de jeu en réseau et j'ai été amené à utilisé le pattern de abstract factory, pattern que je n'avais jamais utilisé auparavant (j'ai suivi ce tuto : http://jmdoudoux.developpez.com/cour...esign-patterns chapitre 95.1.2. )

    Cependant j'ai un petit blocage pour instancier la factory et les objets que la factory fabrique.

    Pour m'expliquer voici un petit exemple (en gros un exemple simplifié qui représente ce que j'ai fait ) :

    - Dans un 1er temps j'ai une sorte de package contenant une interface de factory (IMyObjectFactory.java), et une classe abstraite qui correspond aux objets crées par la factory (MyObject.java) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public abstract class MyObject{
     
    private int a;
    private int b;
     
    public MyObject( int a , int b ) {
    this.a = a;
    this.b = b;
    }
     
    public abstract void run();
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface IFactory {
     
    public MyObject getMyObject( int a , int b );
     
    }
    On peut voir que MyObject a un constructeur, pour forcer les attributs "a" et "b" a être instanciés.

    - Maintenant dans un second temps on veut implémenter ces classes : MyNewObject extends MyObject et MyNewObjectFactory implements MyObjectFactory. Cependant le constructeur de MyNewObject va avoir un argument en plus :

    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
     
    public class MyNewObject extends MyObject {
     
    private int c;
     
    public MyObject( int a , int b , int c ) {
    super(a,b);
    this.c = c;
    }
     
    public void run() {
    // méthode implémentée !
    }
     
    }
    Donc maintenant si je veux implémenter la factory : Erreur ! Car il y a un argument de trop ! :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class MyNewObjectFactory implements IFactory {
     
    public MyNewObject getMyObject( int a , int b , int c ) { // Les arguments ne correspondent plus avec l'interface !
    return new MyNewObject(a,b,c);
    }
     
    }
    Donc voilà je n'ai pas trouvé de solution pour résoudre le problème SANS modifier le constructeur de MyNewObject (si j'enlève l'argument "c" du constructeur de MyNewObject et que je le fais passer par une méthode : "void setArgumentC(int c)" que j'ajoute à MyNewObject, alors cela marche. Mais j'aimerais de préférence une solution qui ne touche pas à MyNewObject )

    Voilà j'espère que j'ai été clair

    Merci d'avance

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    ce type de pattern factory n'est pas utile si les objets à créer ne prennent pas les même paramètres à la création.

    Tu pensais que tu allais gagner quoi, en faisant ça ?
    Ben oui, rien -_-°.

    À la rigueur, si tes factories servent à faire d'autres choses en plus que juste choisir quel type d'objet va être généré par la factory, ça peut encore être utile de s'en servir... Mais c'est pas évident.
    Il "suffit" d'utiliser les génériques.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public interface IFactory<P> {
     
      public MyObject getMyObject(P parameter);
     
    }
     
    public class MyObjectParam {
      public final int a;
      public final int b;
     
      public MyObjectParam(int a, int b) {
        this.a = a;
        this.b = b;
      }
    }
     
    public class MyNewObjectParam extends MyObjectParam {
      public final int c;
     
      public MyNewObjectParam(int a, int b, int c) {
        super(a, b);
        this.c = c;
      }
    }
     
    public class MyNewObjectFactory implements IFactory<MyNewObjectParam> {
     
      public MyNewObject getMyObject(MyNewObjectParam parameter) {
        return new MyNewObject(parameter.a, parameter.b, parameter.c);
      }
     
    }
    Et ça s'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    IFactory<MyNewObjectParam> factory = new MyNewObjectFactory();
     
    // ...
     
    MyNewObjectParam param = new MyNewObjectParam(1, 2, 3);
     
    MyObject object = factory.getMyObject(param);
    Notamment il devient possible de faire :

    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
    public <P> List<MyObject> creer5ObjetsEgaux(IFactory<P> factory, P parameter) {
      List<MyObject> liste = new ArrayList<>();
      for(int i = 0; i < 5; i++) {
        liste.add(factory.getMyObject(parameter));
      }
      return list;
    } 
     
    public void tester() {
      IFactory<MyNewObjectParam> factory = new MyNewObjectFactory();
     
      MyNewObjectParam param = new MyNewObjectParam(1, 2, 3);
     
      List<MyObject> objects = creer5ObjetsEgaux(factory, param);
    }
    ... Bon, encore faut-il que tout cela serve vraiment à quelque chose.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. abstract factory pattern
    Par dhoorens dans le forum C++
    Réponses: 2
    Dernier message: 28/10/2010, 08h51
  2. Réponses: 5
    Dernier message: 10/05/2007, 16h03
  3. [C#] [ADO.NET] Besoin de conseil
    Par djsbens dans le forum Accès aux données
    Réponses: 8
    Dernier message: 01/04/2005, 15h04
  4. Réponses: 3
    Dernier message: 24/12/2004, 12h21
  5. Réponses: 1
    Dernier message: 06/01/2003, 07h55

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