Le modèle "Builder" est-il limité à la lutte contre l'anti-modèle "constructeur télescopique", ou peut-on dire qu'il aborde également le problème plus général de la création compliquée d'objets immuables?
La StringBuilder
classe a le mot «constructeur» dans son nom, mais cela n'a rien à voir avec les constructeurs télescopiques, cela nous aide simplement à collecter toutes les données dont nous avons besoin pour passer au constructeur d'un objet immuable.
Pour moi, il semble que la réponse soit un «oui» très clair, mais il semble y avoir un certain désaccord sur le sujet, alors j'espérais que quelqu'un pourrait peut-être le clarifier.
Je répondais à cette question: Programmeurs SE: légitime «vrai travail» chez un constructeur? où l'OP veut créer un objet (vraisemblablement immuable) contenant un arbre complexe, et l'idée du modèle "constructeur" est apparue, et en le recherchant, j'ai trouvé ce Q&R qui semble dire que le style de création d'objet "StringBuilder" est pas une application du modèle "Builder", pour des raisons qui ne sont pas claires pour moi: Stackoverflow - StringBuilder et Builder Pattern . (Ceux qui ont répondu à cette question n'ont pas réussi à convaincre autant que je sache.)
la source
StringBuilder
semble utiliser un tableau de caractères sous-jacent pour représenter la chaîne et vous permet de faire des choses comme des insertions et des suppressions à tout moment. En fin de compte, je pense que StringBuilder est une solution de contournement pour les objets String immuables, mais il me semble par ailleurs qu'il répond à l'intention du modèle Builder.Réponses:
A
StringBuilder
est similaire à un modèle de générateur, mais ne partage pas beaucoup avec la description GoF de ce modèle de conception. Le point d'origine du motif de conception était(note: «complexe» signifie principalement «composé de plusieurs parties», pas nécessairement «compliqué» ou «difficile»)
Les «différentes représentations» sont essentielles ici. Par exemple, en supposant ce processus de construction:
nous pourrions nous retrouver avec un
HtmlDocument
ou unTexDocument
ou un enMarkdownDocument
fonction de la mise en œuvre concrète fournie:Donc, un point central du motif Builder est le polymorphisme . Le livre Design Patterns compare ce modèle à la fabrique abstraite:
Cet aspect étape par étape est alors devenu l'aspect le plus populaire du modèle Builder, de sorte que dans le langage courant, le modèle Builder est compris comme suit:
Wikipedia définit le modèle comme ceci:
Donc, comme nous pouvons le voir, il n'y a pas de compréhension vraiment commune du modèle auquel ce nom fait référence, et sur certains points, différentes définitions se contredisent même (par exemple en ce qui concerne la pertinence du polymorphisme pour les constructeurs).
La seule propriété commune du
StringBuilder
avec diverses interprétations du motif est que le produit est créé étape par étape plutôt qu'en une seule fois. Il ne répond pas à une lecture stricte de la définition du modèle de conception du GoF, mais veuillez noter que les modèles de conception sont des concepts malléables destinés à faciliter la communication. Je continuerais d'appelerStringBuilder
un exemple du modèle Builder, bien qu'atypique - la principale raison de cette structure en Java est une concaténation performante en présence de chaînes immuables, mais pas une conception orientée objet intéressante.la source