Les usines présentent de nombreux avantages qui permettent de concevoir des applications élégantes dans certaines situations. La première est que vous pouvez définir les propriétés des objets que vous souhaitez créer ultérieurement en un seul endroit en créant une usine, puis remettre cette usine. Mais souvent, vous n'avez pas vraiment besoin de le faire. Dans ce cas, l'utilisation d'une usine ajoute simplement une complexité supplémentaire sans vous donner quoi que ce soit en retour. Prenons cette usine, par exemple:
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
Une alternative au modèle Factory est le modèle Builder très similaire. La principale différence est que les propriétés des objets créés par une fabrique sont définies lorsque la fabrique est initialisée, tandis qu'un générateur est initialisé avec un état par défaut et toutes les propriétés sont définies par la suite.
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
Mais lorsque la suringénierie est votre problème, le remplacement d'une usine par un constructeur n'est probablement pas une grande amélioration.
Le remplacement le plus simple de l'un ou l'autre modèle est bien sûr de créer des instances d'objet avec un constructeur simple avec l' new
opérateur:
Widget widget = new ColoredWidget(COLOR_RED);
Les constructeurs, cependant, ont un inconvénient crucial dans la plupart des langages orientés objet: ils doivent renvoyer un objet de cette classe exacte et ne peuvent pas retourner un sous-type.
Lorsque vous devez choisir le sous-type lors de l'exécution mais que vous ne souhaitez pas recourir à la création d'une nouvelle classe Builder ou Factory pour cela, vous pouvez utiliser une méthode d'usine à la place. Il s'agit d'une méthode statique d'une classe qui renvoie une nouvelle instance de cette classe ou l'une de ses sous-classes. Une usine qui ne maintient aucun état interne peut souvent être remplacée par une telle méthode d'usine:
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
Une nouvelle fonctionnalité de Java 8 sont les références de méthodes qui vous permettent de transmettre des méthodes, comme vous le feriez avec une fabrique sans état. Idéalement, tout ce qui accepte une référence de méthode accepte également tout objet qui implémente la même interface fonctionnelle, qui peut également être une usine à part entière avec un état interne, de sorte que vous pouvez facilement introduire des usines plus tard, lorsque vous voyez une raison de le faire.