Salut
j'aimerais savoir si la fabrique abstraite doit être de préférence un singleton :
Merci
Salut
j'aimerais savoir si la fabrique abstraite doit être de préférence un singleton :
Merci
"La" fabrique abstraite de quoi, où, comment...?
la fabrique abstraite va recevoir un ordre d'une classe cliente pour créer des objets tq: rectangle , cercle..etc
elle va alors deleguer cette responsabilité à ces classes filles "fabrique concretes" ..
alors,pour gerer les ordres qui proviennent de la classe cliente, est ce que cette fabrique abstraite doit etre un "singleton"?
"Une" fabrique n'a d'autre utilité et de comportement que de créer des objets donc qu'il n'est pas nécessaire d'avoir une instance locale d'une telle classe qui n'est appelée que pour en créer d'autres. Ne pas avoir de singleton n'a d'intérêt que si les instances locales de la classe fabrique ont un comportement différent en fonction de la localisation.
Ce que je fais en général, c'est qu'une instance de chaque fabrique concrète est stockée dans une "FactoryFinder". Le stockage se fait dans une hashtable de la FactoryFinder avec un nom particulier pour chaque fabrique concrète.
A l'initialisation de la FactoryFinder, on créé l'ensemble des fabriques concrètes que l'on stocke. Il n'est pas nécessaire que ces fabriques soient des singletons puisque leur manipulation se fera via la FactoryFinder.
Mais si tu veux en faire des singletons, pourquoi pas mais ce n'est pas vraiment utile.
si tu as des besoins de fabriques c'est que tu as besoin de configuration. Je te recommande donc de regarder le framework Spring qui prend tout cela en charge pour toi (http://www.springframework.org)
Je sais pas si cette FactoryFinder va me compliquer le diagramme, parce que je crois que le cas que je traite est plus simple !
En fait il s’agit d’avoir une classe « FabAbstraite » dont les classes filles (concrètes) sont :
-FabVersion1
-FabVersion2
Je crois que : La classe mère « FabAbstraite » ne peut pas ainsi être un singleton. Car son constructeur (privé) ne peut pas passer en héritage !!
Par contre, les classes filles « FabVersion1 » et « FabVersion2 » peuvent être des singletons.
Ainsi, pour créer des objets de la version2 (et j’ai besoin d’utiliser une seule version uniquement), le Client (un seul client) de « FabAbstraite » que doit-il faire ?
FabVersion2.GetInstance() ? (GetInstance est la méthode publique statique qui aide à instancier une seule fois FabVersion2)
Tout ça, (je crois) remet en question l’utilité de la « FabAbstraite » !!
C’est ça mon problème
-avoir la « FabAbstraite » comme singleton --> problème d’héritage
-ou avoir seulement les classes filles des singleton --> remise en question l’utilité de la « FabAbstraite »
Je pense que tu n'a pas saisi l'objet du pattern Abstract Factory.
L'objectif de ce DP est de proposer à des classes une abstraction pour créer des objets sans savoir quel type réel elles créent. Ce pattern est donc utile dans un contexte ou une classe n'a pas à savoir quel type réel elle crée et aussi qu'elle n'a pas besoin de savoir quel est le type réel de l'objet créé pour le manipuler (elle le fait via une interface que les objets créés implémentent).
Imagine un menu dans une application. A l'item 1, on attache la chaine "rectangle", à l'item 2 on attache la chaine "cercle".
Quand un utilisateur sélection un des items, cela veut dire que l'on veut créer puis afficher la figure géométrique correspondant à la chaine attachée à l'item.
On peut donc avoir les classes suivantes (la conception proposée est là pour t'expliquer le DP et non représentative de ce qu'il faudrait faire dans une appli de dessin) :
Figure (méthode affiche)
|___ Rectangle (méthode affiche)
|
|___Cercle (méthode affiche)
FigureFactory (méthode create)
|___RectangleFactory (méthode create - retourne un Rectangle)
|
|___CercleFactory (méthode create - retourne un Cercle)
FactoryFinder {
mesFactories;
FactoryFinder() {
mesFactories.put("rectangle",new RectangleFactory);
mesFactories.put("cercle",new CercleFactory);
}
find(String factoryName) {
return mesFactories.get(factoryName);
}
getInstance() // FactoryFinder est un singleton par exemple
}
Dans la classe qui "reçoit" le click sur l'item du menu
{
Factory factory = FactoryFinder.getInstance().find(item.getChaine());
Figure fig = factory.create();
FigureManager.add(fig);
fig.affiche();
}
!!!? Mais il ne sert à rien ton constructeur privé, il n'est jamais appelé !Envoyé par manel007
Un exemple d'implémentation d'une factory :
http://nx.developpez.com/Articles/DAC/
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager