Bonjour,

j'ai une question sur les factories : J'ai implémenté la mienne ainsi, par réflection :
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
 
 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?