Le modèle Factory Method résume le processus de prise de décision de la classe appelante. Cela présente plusieurs avantages:
Réutilisation. Si je veux instancier à de nombreux endroits, je n'ai pas à répéter ma condition, donc quand je viens d'ajouter une nouvelle classe, je ne risque pas d'en manquer une.
Testabilité unitaire. Je peux écrire 3 tests pour la fabrique, pour m'assurer qu'elle retourne les types corrects dans les conditions correctes, alors ma classe appelante n'a besoin que d'être testée pour voir si elle appelle la fabrique puis les méthodes requises sur la classe retournée. Il ne doit rien savoir de l'implémentation de l'usine elle-même ni des classes concrètes.
Extensibilité. Lorsque quelqu'un décide que nous devons ajouter une nouvelle classe D à cette usine, aucun code appelant, ni tests unitaires ni implémentation, n'a jamais besoin d'être dit. Nous créons simplement une nouvelle classe D et étendons notre méthode d'usine. Telle est la définition même du principe ouvert-fermé .
Vous pouvez même créer une nouvelle classe d'usine et les rendre remplaçables à chaud, si la situation l'exige - par exemple, si vous voulez pouvoir activer et désactiver la classe D pendant le test. Je n'ai rencontré cette situation qu'une seule fois, mais c'était extrêmement utile.
Comme cela a été dit, le Factory Pattern n'est pas toujours le chemin à parcourir. Mais, partout où vous voyez une instanciation conditionnelle, vous devriez y réfléchir un instant.