O padrão "Construtor" está restrito ao tratamento do antipadrão "construtor telescópico" ou pode-se dizer que ele também trata do problema mais geral da criação complicada de objetos imutáveis?
A StringBuilder
classe tem a palavra "construtor" em seu nome, mas não tem nada a ver com construtores telescópicos, ela simplesmente nos ajuda a coletar todos os dados que precisamos passar ao construtor de um objeto imutável.
Para mim, parece que a resposta é um "sim" muito claro, mas parece haver alguma discordância sobre o assunto, então eu esperava que alguém pudesse esclarecer isso.
Eu estava respondendo a essa pergunta: Programadores SE: Legítimo "trabalho real" em um construtor? onde o OP deseja criar um objeto (presumivelmente imutável) contendo uma árvore complexa, e a idéia do padrão "construtor" surgiu e, enquanto pesquisava, encontrei esta seção de perguntas e respostas que parece dizer que o estilo "StringBuilder" de criação de objeto é não é uma aplicação do padrão "Construtor", por razões que não estão claras para mim: Stackoverflow - StringBuilder e Builder Pattern . (Os que responderam a essa pergunta falharam em apresentar um argumento convincente, até onde eu sei.)
fonte
StringBuilder
parece usar uma matriz de caracteres subjacente para representar a String e permite fazer coisas como inserções e remoções a qualquer momento. Por fim, acho que o StringBuilder é uma solução alternativa para objetos String imutáveis, mas, de outra forma, parece-me que ele atende à intenção do padrão Builder.Respostas:
A
StringBuilder
é semelhante ao padrão do construtor, mas não compartilha muito com a descrição do GoF desse padrão de design. O ponto original do padrão de design foi(nota: "complexo" significa principalmente "composto de várias partes", não necessariamente "complicado" ou "difícil")
As "representações diferentes" são fundamentais aqui. Por exemplo, assumindo este processo de construção:
podemos acabar com um
HtmlDocument
ou umTexDocument
ou umMarkdownDocument
dependendo de qual implementação concreta é fornecida:Portanto, um ponto central do padrão Builder é o polimorfismo . O livro Design Patterns compara esse padrão à Abstract Factory:
Esse aspecto passo a passo tornou-se o aspecto mais popular do padrão Builder, de modo que, na linguagem comum, o padrão Builder é entendido assim:
A Wikipedia define o padrão assim:
Portanto, como podemos ver, não há um entendimento verdadeiramente comum a qual padrão esse nome se refere e, em alguns pontos, definições diferentes até se contradizem (por exemplo, com relação à relevância do polimorfismo para os Construtores).
A única propriedade comum do
StringBuilder
com várias interpretações do padrão é que o produto é criado passo a passo e não de uma só vez. Ele não atende a uma leitura estrita da definição do GoF do padrão de design, mas observe que os padrões de design são conceitos maleáveis destinados a facilitar a comunicação. Eu continuaria chamandoStringBuilder
um exemplo do Padrão do Construtor, ainda que atípico - o principal motivo dessa estrutura em Java é a concatenação de desempenho na presença de seqüências imutáveis, mas não um design orientado a objetos interessante.fonte