Lorsque vous utilisez un langage qui prend en charge les arguments nommés et facultatifs, le modèle de générateur n'a-t-il plus d'utilité pratique?
Constructeur:
new Builder(requiredA, requiredB).setOptionalA("optional").Build();
Arguments facultatifs / nommés:
new Object(requiredA, requiredB, optionalA: "optional");
design-patterns
builder-pattern
Paul Nikonowicz
la source
la source
Réponses:
Les constructeurs sont plus utiles lorsque votre objet a besoin de nombreux arguments / dépendances pour être utile, ou si vous souhaitez autoriser de nombreuses façons différentes de construire l'objet.
Du haut de ma tête, je peux imaginer que quelqu'un pourrait vouloir "construire" des objets dans un jeu 3D comme celui-ci:
Je dirais que cet exemple est plus lisible avec les méthodes de générateur que j'ai inventées tout à l'heure qu'avec des paramètres facultatifs:
En particulier, les informations impliquées par les noms de méthode de générateur doivent être remplacées par encore plus de paramètres, et il est beaucoup plus facile d'oublier un paramètre dans un groupe de paramètres étroitement liés. En fait, le fragment shader est manquant, mais vous ne le remarquerez pas à moins de savoir le chercher.
Bien sûr, si votre objet ne prend qu'un à cinq arguments à construire, il n'est pas nécessaire d'impliquer le modèle de générateur, que vous ayez ou non nommé des paramètres facultatifs.
la source
En plus de ce qu'Ixrec a dit, les constructeurs ou la méthode nommée paramètres ne vous permettront pas d'avoir votre objet dans un état à construire dans lequel il peut encore être modifié avant de le construire. C'est la beauté du Builder, où vous pouvez déléguer des parties de sa construction à différentes méthodes ou classes:
Fondamentalement, vous pouvez également lancer votre générateur autour de votre système jusqu'à ce qu'il soit prêt à créer l'objet final, ce qui vous permet de réduire la quantité de connaissances dont votre constructeur-consommateur a besoin.
la source
Cela dépend de ce que vous faites avec le constructeur.
Si vous utilisez le générateur uniquement pour définir (et faire varier) les propriétés des objets et (différer) la création d'objets, il peut être remplacé par des paramètres nommés.
En remplaçant le générateur, vous pouvez avoir le compromis lisibilité / utilisation que @Ixrec a mentonné (ou ne pas l'avoir, cela dépend de ce que vous faites avec le générateur).
Cependant, si votre constructeur fait plus que simplement conserver les propriétés et que chaque étape de construction implique une logique, elle ne peut pas être remplacée.
MockBuilder est un exemple où il ne peut pas être remplacé par des paramètres nommés. Depuis la page:
la source
Le modèle de générateur est essentiel lorsque vous travaillez avec des objets immuables. Il y a beaucoup d'avantages à travailler avec des objets immuables, en particulier pour rendre votre programme plus robuste à exécuter dans un environnement simultané (c'est-à-dire des threads)
la source
new Integer(42)
,new BigDecimal("42.000")
etnew String("foobar")
sont tous les constructeurs à immutables que ... eh bien, un constructeur serait complexe inutilement pour ces cas. Un constructeur n'est donc pas essentiel pour travailler avec immuable alors que les constructeurs peuvent tout aussi bien fonctionner.