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
Separe la construcción de un objeto complejo de su representación para que el mismo proceso de construcción pueda crear diferentes representaciones.
- de Patrones de diseño , de Gamma, Helm, Johnson, Vlissides.
(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:
interface ArticleBuilder {
void addTitle(String title);
void addParagraph(String paragraph);
}
void createArticle(ArticeBuilder articleBuilder) {
articleBuilder.addTitle("Is String Builder an application of ...");
articleBuilder.addParagraph("Is the Builder Pattern restricted...");
articleBuilder.addParagraph("The StringBuilder class ...");
}
podríamos terminar con a HtmlDocument
o a TexDocument
o a MarkdownDocument
dependiendo de qué implementación concreta se proporcione:
class HtmlDocumentBuilder implements ArticleBuilder {
...
HtmlDocument getResult();
}
HtmlDocumentBuilder b = new HtmlDocumentBuilder();
createArticle(b);
HtmlDocument dom = b.getResult();
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:
Abstract Factory es similar al generador en que también puede construir objetos complejos. La principal diferencia es que el patrón de Constructor se enfoca en construir un objeto complejo paso a paso. […] Builder devuelve el producto como un paso final, pero en lo que respecta a Abstract Factory, el producto se devuelve de inmediato.
- de Patrones de diseño , de Gamma, Helm, Johnson, Vlissides.
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í:
Dividir la construcción de un objeto en múltiples pasos. Esto nos permite usar argumentos con nombre o parámetros opcionales incluso en idiomas que no admiten estas características.
Wikipedia define el patrón así:
El patrón generador es un patrón de diseño de software de creación de objetos. A diferencia del patrón de fábrica abstracto y el patrón de método de fábrica cuya intención es habilitar el polimorfismo, la intención del patrón generador es encontrar una solución al antipatrón del constructor telescópico [cita requerida] . [...]
El patrón de constructor tiene otro beneficio. Se puede usar para objetos que contienen datos planos (código html, consulta SQL, certificado X.509 ...), es decir, datos que no se pueden editar fácilmente. Este tipo de datos no se puede editar paso a paso y se debe editar de una vez. La mejor manera de construir un objeto de este tipo es usar una clase de generador. [cita requerida]
- de Builder Pattern en Wikipedia , por varios colaboradores.
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 a StringBuilder
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.