Moi, je ne cherche pas absolument à coller à une philosophie. Je veux répondre à mon besoin, c'est tout : on me file un nom de fichier, et en fonction de l'extension, créer l'objet qui va bien.
4. Tu as besoin d'une factory si tu veux ensuite manipuler ces objets sans connaître leur vrai type. Par exemple :
MonFicher fichier = FileFactory.CreateFichier("c:\\truc.jpg");
Fichier sera en fait du type MonImage mais, toi, tu t'en fiches : MonImage ne fournit qu'une implémentation et pas de nouvelles méthodes ou propriétés dont tu as besoin dans l'immédiat.
En revanche, si tu as besoin de connaître le vrai type juste après l'instanciation alors il te faut... des constructeurs !
MonImage image = new MonImage("c:\\truc.jpg");
En effet, à quoi bon créer une Factory si de toute façon, en-dehors de la factory, tu vas à nouveau avoir besoin de regarder l'extension pour savoir quel type tu dois récupérer ?
Ou alors tu peux avoir besoin de différentes méthodes de création selon le contexte, une Factory abstraite pourrait alors se justifier. Un lecteur multimédia pourrait, à certains stades, vouloir charger toutes les données mais, à d'autres vouloir simplement les méta données. Dans ce cas, ok, une Factory pourrait être nécessaire : à un point A du code on donne à la Factory abstraite les Factory à utiliser pour chaque type de fichier (soit les instanciations pleines, soit les partielles) et, plus tard, à un point B du code, la Factory abstraite est utilisée pour instancier les fichiers, et ces fichiers sont consommés sans savoir si toutes les données ont été lues ou simplement les métadonnées.
Enfin, si c'est simplement parce que tu as besoin d'enregistrer ton fichier dans différentes collections et autres, c'est un pattern builder qu'il te faut, pas une factory.
1. C'est sale parce qu'en donnant un exemple dans lequel les codes numériques des types et les ObjectCreator sont tous deux des membres statiques des types, ça rend la Factory inutile, on aurait aussi bien pu utiliser des constructeurs. La Factory abstraite proposée peut néanmoins avoir son intérêt, il aurait fallu un meilleur exemple.
2. J'ai du mal à saisir ce que tu veux dire. Si tu te contentes d'une méthode de création surchargée dans chaque type, ça s'appelle un constructeur. Si tu veux dire qu'on pourrait partir d'un ObjectCreator générique (se contentant de constructeurs sans arguments) avec une méthode Init() sur AObject que l'on surchargerait dans chaque classe fille, encore une fois pourquoi ne pas simplement utiliser un constructeur ?
3. Le code suivant ne marche pas :
1 2
| var type = typeof(AObject)
new type(); |
En effet, "type" n'est pas connu à la compilation donc, à l'exécution, il faudrait utiliser la reflection pour obtenir le constructeur à appeler. En revanche, tu peux faire Activator.Create(typeof(AObject)) ou Activator.Create((new AObject).GetType()), Activator se charge justement d'utiliser la reflection pour obtenir le constructeur et ensuite l'invoquer.
Partager