Ao usar uma linguagem que suporta argumentos nomeados e opcionais, o padrão do construtor não tem mais um uso prático?
Construtor:
new Builder(requiredA, requiredB).setOptionalA("optional").Build();
Argumentos opcionais / nomeados:
new Object(requiredA, requiredB, optionalA: "optional");
design-patterns
builder-pattern
Paul Nikonowicz
fonte
fonte
Respostas:
Os construtores são mais úteis quando seu objeto precisa de muitos argumentos / dependências para ser útil, ou você deseja permitir várias maneiras diferentes de construir o objeto.
Em cima da minha cabeça, eu posso imaginar que alguém possa querer "construir" objetos em um jogo 3D como este:
Eu diria que este exemplo é mais legível com os métodos construtores que criei agora do que com parâmetros opcionais:
Em particular, as informações implícitas nos nomes dos métodos do construtor precisam ser substituídas por mais parâmetros, e é muito mais fácil esquecer um parâmetro em um grupo de parâmetros intimamente relacionados. De fato, o shader de fragmento está ausente, mas você não notaria isso a menos que soubesse procurá-lo.
Obviamente, se o seu objeto precisar de um a cinco argumentos para construir, não há necessidade de envolver o padrão do construtor, independentemente de você ter nomeado / não parâmetros opcionais.
fonte
Além do que o Ixrec disse, os construtores ou o método nomeado parâmetros não permitirão que você tenha seu objeto em um estado a ser construído, no qual ele ainda pode ser modificado antes de construí-lo. Esta é a beleza do Construtor, onde você pode delegar partes de sua construção para diferentes métodos ou classes:
Basicamente, você também pode lançar seu construtor em torno de seu sistema até que esteja pronto para construir o objeto final, permitindo diminuir a quantidade de conhecimento que seu construtor-consumidor precisa ter.
fonte
Depende do que você está fazendo com o construtor.
Se você estiver usando o construtor apenas para definir (e variar) propriedades do objeto e (adiar) a criação do objeto, ele poderá ser substituído por parâmetros nomeados.
Substituindo o construtor, você pode ter a troca de legibilidade / uso mencionada pelo @Ixrec (ou pode não o ter, depende do que você está fazendo com o construtor).
No entanto, se o construtor fizer mais do que apenas manter as propriedades e cada etapa da construção envolver lógica, ela não poderá ser substituída.
O MockBuilder é um exemplo em que não pode ser substituído por parâmetros nomeados. Na página:
fonte
O padrão do construtor é essencial ao trabalhar com objetos imutáveis. Existem muitos benefícios ao trabalhar com objetos imutáveis, especialmente para tornar seu programa mais robusto na execução em um ambiente simultâneo (ou seja, threads)
fonte
new Integer(42)
,new BigDecimal("42.000")
enew String("foobar")
são todos os construtores para imutáveis que ... bem, um construtor seria desnecessariamente complexo para esses casos. Portanto, um construtor não é essencial para trabalhar com imutáveis quando os construtores também podem funcionar.