Builder: Separe a construção de um objeto complexo de sua representação, para que o mesmo processo de construção possa criar representações diferentes.
Use cenários:
Diagrama de classe geral:
Por exemplo: muitos dispositivos em nossas vidas existem em forma de montagem, como computadores de mesa. Alguns fabricantes lançarão alguns hosts de computador montados com configurações padrão (o modo de método do modelo pode ser usado aqui). Os clientes podem comprar produtos com configurações padrão ou solicitar que os fabricantes remontem um host com diferentes configurações e métodos de montagem. Neste ponto, podemos usar o modelo do construtor para atender aos requisitos de clientes especiais.
Observe que, neste exemplo, o fabricante está remontando a um host, ou seja, o foco está em cada componente do host, que está alinhado com o cenário de uso fornecido pelo modo Builder acima.
A implementação simples de código é a seguinte:
// Classe de produto abstrato, usando o modo de método de modelo, diferentes produtos têm diferentes "Parte do componente" AbstractRoduct AbstractProduct {Protected Void Part01 (); Resumo Protegido Void Part02 (); Resumo Protegido Void Part03 (); // O método de modelo fornece o método de montagem padrão, gerando o produto padrão public final abstrateProduct defaultProduct () {part01 (); part02 (); part03 (); Retorne isso; // retorna o objeto atual, ou seja, o produto com o método de montagem padrão}} // Produtos específicos A e B, diferentes produtos implementam diferentes classes de "Parte do componente" ConcreteProducta estende abstrumProduct {Protected void Part01 () {System.out.println ("Produto A: Part01 () ..."); } void protegido Part02 () {System.out.println ("Produto A: Part02 () ..."); } void protegido Part03 () {System.out.println ("Produto A: Part03 () ..."); }} classe concreteProductB estende abstractProduct {Protected void Part01 () {System.out.println ("Produto B: Part01 () ..."); } void protegido Part02 () {System.out.println ("Produto B: Part02 () ..."); } void protegido Part03 () {System.out.println ("Produto B: Part03 () ..."); }} // Builder abstrato, formula o método de combinação que cada produto deve implementar o BuildPart () e o padrão para a produção de BuildProduct () Abstract Class AbstractBuilder {public abstract void BuildPart (); Public Abstract AbstractProduct BuildProduct (); } / * * Se o construtor específico não estiver satisfeito com o produto padrão (ou seja, quando o método defaultProduct () no produto abstrato é chamado), * você não pode chamá -lo para obter o produto, mas use o construtor específico para alterar o método de produção e montagem do produto para obter diferentes produtos * / classe concretebuildera abstratherbuilder; public void BuildPart () {this.producta.part03 (); this.producta.part02 (); this.producta.part01 (); } public abstractProduct BuildProduct () {return this.producta; }} classe ConcreteBuilderB estende abstractBuilder {Private AbstractProduct ProductB = new ConcreteProductB (); public void BuildPart () {this.productb.part02 (); this.productb.part01 (); // Um componente no produto B é omitido, por exemplo, as funções desta parte não são necessárias pelos clientes // this.productb.part03 (); } public abstractProduct BuildProduct () {return this.productb; }} // Classe de diretor, o construtor que precede cada produto, fornece diferentes métodos de montagem para usuários que precisam de produtos diferentes do que o diretor da classe de produto padrão {Private AbstractBuilder Builda = new ConcreteBuildera (); Private AbstractBuilder BuildB = new ConcreteBuilderB (); public abstractProduct getProducta () {this.buildera.buildPart (); retornar this.buildera.buildproduct (); } public abstractProduct getProductB () {this.builderb.buildPart (); retornar this.builderb.buildproduct (); }} // classe de teste classe public client {public static void main (string [] args) {System.out.println ("Use o modo de método do modelo para obter o produto padrão a"); Abstractproduct defaultProducta = new concreteProducta (). DefaultProduct (); System.out.println ("/NUSE Diretor Classe para obter o produto A com diferentes métodos de montagem"); Diretor Diretor = New Diretor (); Diretor.getProducta (); System.out.println ("/NUSE Diretor Classe para obter o produto B com diferentes métodos de montagem"); diretor.getProductB (); }} Resultados do teste:
Use o modo de método de modelo para obter o produto padrão a
Produto A: Part01 () ...
Produto A: Part02 () ...
Produto A: Part03 () ...
Use a classe do diretor para obter produtos com diferentes métodos de montagem a
Produto A: Part03 () ...
Produto A: Part02 () ...
Produto A: Part01 () ...
Use a classe do diretor para obter o produto B com diferentes métodos de montagem
Produto B: Part02 () ...
Produto B: Part01 () ...
De fato, neste exemplo, a categoria de produto usa o modo de método de modelo mencionado no artigo anterior, ou seja, o padrãoProduct () fornece um método para montar um componente padrão do produto.
Mas eu tenho uma pergunta aqui. O chamado método de montagem padrão fornecido na classe AbstractProduct com base no padrão de método do modelo é apenas imprimir algumas frases de teste e não retorna realmente um produto específico. No entanto, não sei se o método de processamento de retornar um objeto atual (retornar isso;) no exemplo acima é razoável?
Além disso, depois de escrever esses artigos sobre a implementação de padrões de design com código Java, descobri que esse padrão do construtor de construtores parece combinar padrão abstrato de fábrica e padrão de método de modelo. O parágrafo acima já mencionou minhas dúvidas. Quanto ao modelo abstrato de fábrica, acho que a classe Diretor no exemplo de código acima é muito semelhante à classe de fábrica específica da fábrica abstrata, mas a classe do diretor também precisa construir o método de montagem do produto antes de devolver um produto. Talvez seja essa "construção" que faz com que o modelo do construtor se concentre na montagem de várias partes do produto, enquanto o modelo abstrato de fábrica se concentra apenas na geração de um produto final.
Eu já li uma frase antes e disse que é dito aproximadamente: Se for difícil resolver algum problema de computador, ela pode ser tratada adicionando uma camada intermediária. Agora que penso nisso, parece que tanto a fábrica abstrata quanto o modo construtor usam esse "princípio" para alcançar o efeito desejado. Por exemplo, existe uma aula de fábrica abstrata na fábrica abstrata, e há uma classe de diretor no construtor. Na análise final, é encapsular e ocultar certos detalhes e dissociá -los da implementação e uso.
Eu acho que você deve primeiro entender as preocupações e cenários aplicáveis de cada modelo antes de poder entender melhor.
Talvez esses modos sejam todos os modos criativos e eu não tenha nenhuma experiência prática, o que me deixa um pouco confuso com isso ... não tenho medo, pensando um pouco no processo de implementar todos eles, e aplicá -los lentamente à realidade deve entender gradualmente.
O exposto acima é tudo sobre este artigo, e espero que ele o inspire a aprender.