Le site modèle de méthode d'usine statique est un moyen d'encapsuler la création d'objets. Sans une méthode de fabrique, vous appelleriez simplement la méthode de création de la classe Constructeur directement : Foo x = new Foo()
. Avec ce modèle, vous feriez plutôt appel à la méthode factory : Foo x = Foo.create()
. Les constructeurs sont marqués comme privés, ils ne peuvent donc être appelés que depuis l'intérieur de la classe, et la méthode d'usine est marquée comme étant static
afin qu'il puisse être appelé sans avoir d'abord un objet.
Ce modèle présente quelques avantages. Le premier est que la fabrique peut choisir parmi de nombreuses sous-classes (ou implémenteurs d'une interface) et les retourner. De cette façon, l'appelant peut spécifier le comportement souhaité via des paramètres, sans avoir à connaître ou à comprendre une hiérarchie de classes potentiellement complexe.
Un autre avantage est, comme l'ont souligné Matthew et James, de contrôler l'accès à une ressource limitée telle que les connexions. C'est une façon d'implémenter des pools d'objets réutilisables - Au lieu de construire, utiliser et détruire un objet, si la construction et la destruction sont des processus coûteux, il peut être plus judicieux de les construire une fois et de les recycler. La méthode factory peut retourner un objet instancié existant et inutilisé si elle en a un, ou en construire un si le nombre d'objets est inférieur à un certain seuil, ou encore lever une exception ou renvoyer null
si elle est supérieure au seuil supérieur.
Selon l'article de Wikipedia, les méthodes d'usine multiples permettent également différentes interprétations de types d'arguments similaires. Normalement, le constructeur porte le même nom que la classe, ce qui signifie que vous ne pouvez avoir qu'un seul constructeur avec une classe donnée. signature . Les usines ne sont pas aussi limitées, ce qui signifie que vous pouvez avoir deux méthodes différentes qui acceptent les mêmes types d'arguments :
Coordinate c = Coordinate.createFromCartesian(double x, double y)
et
Coordinate c = Coordinate.createFromPolar(double distance, double angle)
Cela peut également être utilisé pour améliorer la lisibilité, comme le note Rasmus.
1 votes
Une alternative aux méthodes d'usine statique est l'utilisation de l'injection de dépendances.
2 votes
@ThangPham La réponse de Jason Owen est imparfaite parce qu'elle prétend parler du modèle Factory Method, qui est très différent du modèle statique Factory Method dont elle parle réellement. Ainsi, bien qu'elle réponde bien à la question posée, je ne pense pas qu'elle puisse être acceptée dans son état actuel, parce qu'elle introduit un modèle sans rapport et augmente la confusion déjà incroyablement courante sur la différence entre les deux modèles.
1 votes
@CMCDragonkai Je pense que l'injection de dépendance et la fabrique statique sont différentes. La fabrique statique peut être nécessaire même dans le cas de l'injection de dépendances pour instancier les dépendances à injecter.