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(); }On peut voir que MyObject a un constructeur, pour forcer les attributs "a" et "b" a être instanciés.
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 ); }
- 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 :
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
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 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 )
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); } }
Voilà j'espère que j'ai été clair
Merci d'avance
Partager