[DUMD 9/24] Le design pattern Factory

Auteur du billet de blog : Nicolas Hilaire - Neotech Solutions

Nicolas Hilaire

Consultant .NET
  Publié le mercredi 16 novembre 2016

Artisan logiciel particulièrement intéressé par les technologies .NET. Polyvalent et curieux, je suis néanmoins à l'écoute des autres technologies du marché. MVP (Microsoft Most Valuable Professional) de 2007 à 2014, je suis également auteur d'un ouvrage pour apprendre le C#, à destination des débutants et de plusieurs MOOCs sur le C#, Windows Phone ou ASP.NET MVC...

Neuvième billet sur comment devenir un meilleur développeur. Pour retrouver le sommaire ainsi que tous les liens, rendez-vous sur le premier billet.

Nous allons parler dans ce billet du design pattern Factory, que l'on peut traduire par "Fabrique" en français, mais que l'on utilise assez rarement.

La factory facilite la création d'objets. Elle permet de créer des objets à partir d'une abstraction. Ainsi, le consommateur n'a pas à se soucier du type concret et de sa création. Cela permet de centraliser également les créations d'objets complexes.

 

La factory en action

On a bien vu dans le billet précédent, sur le pattern décorateur, que la construction des objets devenait plus complexe. Pour rappel, la décoration ressemblait à ceci :

 

 

Essayons donc de simplifier un peu ça. L'idée est d'encapsuler et de centraliser la construction de ces objets plus ou moins complexe ; déjà, pour nous simplifier la tâche mais aussi à cause de notre ami le changement. Vous pouvez être sûrs que votre application va devoir changer - on est d'accord là-dessus - et si vous disséminez un peu partout des constructions d'objets complexes de ce genre et qu'à un moment donné il faut les changer, et bien si tout est au même endroit, cela sera quand même beaucoup plus simple.

C'est là le but de la factory. Voyons comment on peut faire ceci. La première idée sera de créer une classe de ce genre :

 

 

Et que l'on utilisera ainsi :

 

 

On a une classe qui s'occupe de faire les instanciations et des méthodes explicites pour récupérer des instances d'objet. Et tout ça au même endroit.

Notez que la fabrique est statique ici, ce que vous avez entièrement le droit de faire, et qu'elle doit absolument renvoyer une abstraction (ici un ICalculateur) sinon cela n'a pas beaucoup d'intérêt.

Ce qui se fait aussi, c'est de passer en paramètre une précision sur ce que l'on veut construire (une chaîne, un enum, peu-importe) et on se retrouve avec une unique méthode :

 

 

Ce qui peut être plus pratique dans les cas où le type est conditionné par une saisie ou par une valeur récupérée ailleurs. On l'utilisera bien sûr de cette façon :

 

 

Dérivés

Factory est un terme assez général pour parler du principe de création d'objet. L'exemple que l'on a vu au dessus est en général appelé Factory Method et utilise une abstraction.

Vous pouvez aussi vous servir du principe de Factory pour simplifier vos créations d'objets à partir du moment où il y a plusieurs surcharges du constructeur d'une classe, afin de rendre explicite l'intention de cette création. Regardez cet exemple emprunté à Wikipédia : 

 

 

Ici, nous avons deux méthodes de fabrique qui rendent explicite la création d'un nombre complexe. Le constructeur (ou plusieurs si besoin) sont rendus privés, ainsi la seule façon d'obtenir une instance de la classe Complex est de passer par une des méthodes statiques.

Les fabriques n'ont pas forcément besoin d'être statiques. Il y a des variantes plus évoluées de la factory, notamment la factory abstraite qui fournit une interface pour créer des familles d'objets apparentés ou dépendants sans avoir à spécifier leurs classes concrètes.

 

Conclusion

Il faut retenir que la fabrique sert à faciliter la création d'objets. Elle est à utiliser lorsque la création d'objet est complexe et que sa réutilisation nécessiterait de la duplication de code. On peut s'en servir aussi lorsque certaines ressources ne sont accessibles que dans la classe en question.

Ce que j'aime dans la factory, c'est qu'elle incite à décrire l'intention avec un nommage approprié bien plus parlant qu'un pauvre new.

N'hésitez pas à regarder d'autres exemples d'utilisation de la fabrique, par exemple chez Wikipedia, où vous trouverez notamment la modélisation des classes avec UML.

 

Prochain billet sur le design pattern Adaptateur.