[MÚSICA] [MÚSICA] Olá a todos. Meu nome é Eduardo Guerra. Esse é o curso de Desenvolvimento Ágil com Padrões de Projeto e hoje vamos falar do padrão Factory Method, outro padrão que utiliza os Hook Methods. Esse, no caso, é padrão de criação. Então, a gente vê que têm várias classificações, tipos de técnicas que utiliza, pela questão do motivo, nesse caso padrão para criar objeto. Mas, vamos ver como ele utiliza o Hook Method para delegar a criação de objeto para a subclasse. Vamos ver, então. Imagine que eu tenho uma classe Carro e é uma classe abstrata e tem algumas implementações mais específicas ali. Só que se a gente pegar cada carro, a classe Carro é composta por uma outra classe chamada Motor. E aí, essa classe Motor é utilizada para várias outras funcionalidades dentro do carro, como para andar, para a questão do consumo de combustível, etc, até mesmo para o cálculo da temperatura, vamos imaginar. Então, imagine, eu tenho uma classe abstrata Carro e dentro dela tem uma outra classe Motor, que também é abstrata. A questão é a seguinte: o Motor também tem motores específicos, e não é todo o tipo de motor que vai caber todo o tipo de carro. Então, é aquela coisa: só é possível saber qual é a instância de motor que eu vou utilizar quando eu sei qual é o carro. Mas, ainda assim, eu quero poder utilizar esse conceito de motor do ponto de vista mais abstrato na minha superclasse, que é abstrata. Nossa, que confusão! Basicamente, é o seguinte: como que eu vou criar objeto? Como lá na superclasse, eu posso falar assim: crie para mim motor, que eu quero utilizá-lo uma funcionalidade, sendo que, só lá na subclasse eu vou saber qual o motor que eu tenho que criar. Como que eu faço isso? Bom, se você chutou que é para usar Hook Method, acho que você entendeu o conceito que a gente falou nas aulas anteriores. Como que isso funciona? Eu tenho, por exemplo, ali na minha classe Carro, método, por exemplo, o mover, que ela vai, obtém o motor e pode utilizar esse motor. Só que esse método obterMotor é método abstrato que só vai ser definido na subclasse. Então, o que é o Factory Method? É ter método abstrato que cria uma instância que você precisa na superclasse. Mas esse método, por ser abstrato, ele só vai ser definido na subclasse, ou seja, lá na minha classe Fusca, como estou vendo aqui, eu posso, criar o motor do fusca. Ou seja: a superclasse sabe que está utilizando uma classe, que está recebendo objeto e tem essa abstração Motor. Mas só a subclasse é que vai efetivamente definir qual é a instância que esse método vai retornar na prática. Lembrando que a subclasse, por ter método abstrato, ela também vai ser abstrata, ou seja, eu não posso "instanciar" carro, eu tenho que "instanciar" fusca. No momento que eu "instancio" o fusca, eu já sei qual é o motor que ele vai estar utilizando. Olha o conceito de Hook Method de novo, mais padrão que a gente está aprendendo, dessa vez para criar objeto. Certo? Então, a gente percebe que a dependência é definida e utilizada na superclasse, mas a criação dessa dependência é delegada para a subclasse. Então, eu consigo definir e usar na superclasse mas com o Factory Method eu consigo só criar essa instância na subclasse. Olha que bacana! Olha que legal! Que flexibilidade isso dá para o código da gente! Então, esse foi o padrão Factory Method, padrão também muito útil, utilizo bastante, na prática mesmo, e a gente aprendeu como delegar a criação de objeto que a gente precisa na superclasse, para a subclasse. Se você achou essa solução muito legal, continue assistindo o nosso curso, que estamos apenas começando! Até a próxima aula! [MÚSICA] [MÚSICA]