¿El patrón "Constructor" se limita a abordar el antipatrón del "constructor telescópico", o se puede decir que también aborda el problema más general de la creación complicada de objetos inmutables?
La StringBuilder
clase tiene la palabra "constructor" en su nombre, pero no tiene nada que ver con los constructores telescópicos, simplemente nos ayuda a recopilar todos los datos que necesitamos pasar al constructor de un objeto inmutable.
Para mí, parece que la respuesta es un "sí" muy claro, pero parece haber cierto desacuerdo sobre el tema, por lo que esperaba que alguien pudiera aclararlo.
Estaba respondiendo a esta pregunta: Programadores SE: ¿"trabajo real" legítimo en un constructor? donde el OP quiere crear un objeto (presumiblemente inmutable) que contenga un árbol complejo, y surgió la idea del patrón "constructor", y mientras lo investigaba encontré este Q&A que parece decir que el estilo de creación de objetos "StringBuilder" es no es una aplicación del patrón "Builder", por razones que no tengo claras: Stackoverflow - StringBuilder y Builder Pattern . (Los que respondieron esa pregunta no lograron hacer un punto convincente por lo que puedo decir).
fuente
StringBuilder
parece utilizar una matriz de caracteres subyacente para representar la Cadena y le permite hacer cosas como inserciones y eliminaciones en cualquier momento. En última instancia, creo que StringBuilder es una solución alternativa para los objetos String inmutables, pero de lo contrario me parece que cumple con la intención del patrón Builder.Respuestas:
A
StringBuilder
es similar a un patrón de construcción, pero no comparte mucho con la descripción de GoF de este patrón de diseño. El punto original del patrón de diseño era(nota: "complejo" significa principalmente "compuesto de múltiples partes", no necesariamente "complicado" o "difícil")
Las "representaciones diferentes" son clave aquí. Por ejemplo, suponiendo este proceso de construcción:
podríamos terminar con a
HtmlDocument
o aTexDocument
o aMarkdownDocument
dependiendo de qué implementación concreta se proporcione:Entonces, un punto central del patrón Builder es el polimorfismo . El libro Patrones de diseño compara este patrón con la Fábrica abstracta:
Este aspecto paso a paso se ha convertido en el aspecto más popular del patrón Builder, de modo que, en el lenguaje común, el patrón Builder se entiende así:
Wikipedia define el patrón así:
Como podemos ver, no existe una comprensión realmente común de a qué patrón se refiere este nombre y, en algunos puntos, diferentes definiciones incluso se contradicen entre sí (por ejemplo, con respecto a la relevancia del polimorfismo para los constructores).
La única propiedad común de las
StringBuilder
diversas interpretaciones del patrón es que el producto se crea paso a paso en lugar de una sola vez. No cumple con una lectura estricta de la definición GoF del patrón de diseño, pero tenga en cuenta que los patrones de diseño son conceptos maleables destinados a facilitar la comunicación. Continuaría llamando aStringBuilder
un ejemplo del Patrón de construcción, aunque sea atípico: la razón principal de esa estructura en Java es la concatenación performante en presencia de cadenas inmutables, pero no algún diseño interesante orientado a objetos.fuente