[MÚSICA] Olá, bem vindo ao curso Desenvolvimento Ágil com Padrões de Projeto. Eu sou Clovis Fernandes e na aula de hoje, iremos mostrar pra você como resolver aqueles dois primeiros problemas que nós apresentamos com o uso de construtores. O fato de que construtor não é possível explicitar a intenção de programador. E a segunda parte é que a gente não consegue ter dois construtores com a mesma assinatura. Nesta parte iremos então trabalhar apenas a parte da intenção, da falta de intenção dos construtores. Como resolver então esses dois problemas? Especial da falta de intenção. Usando os métodos Estáticos de Fábrica, aqui a gente vai estar colocando os termos inglês e vocês vão estar se acostumando ler artigos e páginas de web que apresentam Static Factory Methods. O método estático, é método que você manda mensagem para a classe, porque ele é método de classe. E o método de fábrica, é método que cria objetos de uma dada classe. Então quando você tem método estático de fábrica, você vai colocar como método estático da classe, que vai permitir você criar objeto naquela classe. Então a primeira coisa que você vai fazer ao começar a criar esses métodos estáticos, tornar o método, o construtor normal, como privado. Atenção, muita atenção. Porque os métodos estáticos de fábrica, foram propostos pelo Joshua Bloch seu livro Static Java, como padrão que fazia parte do kit de ferramentas de todo programador. Não só da linguagem Java, de todo programador. Mas ele não é daqueles padrões de projeto apresentado tradicionalmente nos livros de padrões de projeto. Mas ele é muito importante, ele é muito importante porque na verdade ele é usado muitos outros padrões de projeto. Mesmo quando você não está usando esses padrões de projeto. Então ele é muito importante ter esse aprendizado. Mas ele não constituí esses padrões, não podemos confundir Static Factory Method com os padrões conhecidos. Que são: o método de fábrica, Factory Method e Abstract Factory Method. São dois tipos de padrões que nós vamos apresentar nesse curso. Eventualmente, pode até usar os métodos estáticos de fábrica nesses dois padrões aí. Okay. Mas não vamos confundir, são diferentes. Então vamos retomar a solução para os nossos problemas. Nós tínhamos três intenções que nós mostramos naquelas aulas inicias, parte dois e três, com problemas sobre construtores. Cada intenção... Bom quando você cria uma classe, você pode ter construtor default ou você define construtor enquanto você precisa passar alguns parâmetros, criar algumas coisas que são específicas daquela classe. Cada intenção, eu estaria criando novo construtor, mas nós mostramos que existe conflitos. Principalmente essa falta de explicitar a intenção do programador. Então, como nós vamos resolver? Cada intenção que você tinha de solução, pra o que você quer fazer, aquelas intenções que responderiam requisitos do usuário. Nós vamos criar para cada intenção, método estática de fábrica correspondente. É isso que iremos fazer. Então eu tenho essa intenção aí que é normal, aquela primeira. Eu quero criar número aleatório entre o mínimo e o máximo. Então o que eu faço? Vamos dar uma olhada no que tava anteriormente. A intenção está explícita pelos meus comentários. Quando eu explícito isso através de método estático de fábrica, essa intenção que está comentário, vai sumir. Não preciso mais desse comentário. Porque está explícito lá. E é isso que nós vamos mostrar agora. Primeira coisa que a gente faz então, criar, tornar o método, o construtor, normal, privado. Eu não vou continuar usando. Os meus métodos de fábrica, estarão usando esse construtor privado. Ou seja, ao ser privado, eu não consigo mais usar através de new externamente, para criar objetos de maneira que não seja através de métodos estáticos de fábrica. E a segunda coisa é criar o método estático de fábrica. Vamos olhar com mais atenção. Vocês notam que ele é público e estático. Estou dizendo que é estático, ele vai ser público. Porque como ele é método de fábrica, é dele que eu vou criar o objeto. Por isso, vamos dizer o corpo, eu chamo o construtor normal que eu tinha definido privado. E estou passando os parâmetros int min, int max, min e máximo. E olha a intenção que estou colocando nele aí: entre. Vocês vão ver quando usar o uso, como isso fica claro. E o entre vai expressar intenção, porque agora eu posso colocar nome, nome que representa a intenção do programador. Eu tenho algumas maneiras de representar isso. Eu usei e vou usar só o entre, mas poderia ter chamado por exemplo, o que está aí, get instance entre. Eu estou tornando mais explícito ainda. Quando eu quero representar, que eu quero obter uma instância daquela classe, entre esses dois valores mínimo e máximo. Quando eu coloco só entre, vai ficar claro também, mas não é tão explícito porque o get instance é muito mais expressivo. Porque que eu poderia fazer isso? Esse get instance, poderia estar voltando sempre o mesmo objeto, que você tivesse criado antes. Agora se eu quero expressar que eu quero criar uma nova instância, ao invés de get instance, eu ia chamar new instance entre e os parâmetros. Estaria sempre criando uma nova instância. Eu posso tornar então explícito através do nome. No nosso caso, vamos estar usando... já é suficiente, usando apenas o entre. Vamos ver o nosso exemplo anterior, que eu tinha usado para criar gerador de Int Aleatorio para mínimo três e máximo dezoito. Veja que a intenção não estava explícita quando usava só o construtor, agora logo abaixo, você vê que estou, fica muito mais claro isso. Eu estou agora gerando, veja como ele é estático, eu sou obrigado a colocar o nome da classe, gerador Int Aleatorio, ponto o nome do meu método estático de fábrica, que é entre, e os seus parâmetros. Agora que que aconteceu com ele? Olha o meu raiozinho mostrando agora que a intenção está cumprida. A intenção do programador está explicitada. E é isso que a gente queria mostrar nessa parte. Ou seja, na próxima aula, nós iremos enfatizar esse ponto, criando novos métodos de fábrica para cada dos construtores, para cada uma das intenções que eu tinha, as novas intenções, aquelas antigas que não consegui usar com os construtores. E ao mesmo tempo, quebrando aquele problema de criar dois construtores, porque eu não tenho mais esse problema de criar dois construtores. O construtor é só e privado. Os métodos, agora vão ser diferenciados. Por quê? As assinaturas deles são todas diferentes e é isso que resolve o problema. Obrigado. [MÚSICA] [MÚSICA]