Implémentation d'une Factory
Bonjour,
j'ai une question sur les factories : J'ai implémenté la mienne ainsi, par réflection :
Code:
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
|
public class WSCallerFactory : Mceau_Tal_3_WSCall.IWSCallerFactory
{
IWSParams _iwsParams;
public WSCallerFactory(IWSParams iwsParams)
{
_iwsParams = iwsParams; // paramètres d'environnement
}
IWSCaller IWSCallerFactory.GetInstance(WSCallerName name)
{
WSCallerName.Task..ToString()
IWSCaller iwsc = (IWSCaller)Assembly.GetExecutingAssembly().CreateInstance(
"Mceau_Tal_3_WSCall.WSCallerClass.WSCaller" + name.ToString("G"),
false,
System.Reflection.BindingFlags.CreateInstance,
null,
new object[] {_iwsParams},
null,
null);
if (iwsc == null)
{
throw new ArgumentOutOfRangeException(task);
}
return iwsc;
} |
Avec l'enum SWCallerName déclaré ainsi :
Code:
1 2 3 4 5 6 7
|
enum WSCallerName {
Invoices,
Rapport,
JobExec,
Task
}; |
Cependant, les exemples de factories sur le net utilisent des switch/cases.
Un collègue me fait remarquer qu'avec un switch case, si on veut instancier un objet d'une classe qui n'existe pas, on a une erreur à la compilation, et en plus, on bénéficie de l'intellisense.
Moi, j'aime bien ce que j'ai fait, parce qu'en cas de création d'une nouvelle classe à instancier par cette factory, il n'y a qu'à l'ajouter dans l'enum, sans toucher à la méthode GetInstance, ce qui applique l' "Open/closed principle" de SOLID.
J'ajoute qu'au début, je passais directement un string name, mais on a transformé ça en enum pour restreindre les entrées possible.
Qu'en pensez-vous ?