Fábrica abstrata nos dedos

Fui forçado a escrever este artigo por dois motivos. Mais recentemente, encontrei o padrão Abstract Factory. Como diz o ditado - "Não saiba como fazer isso sozinho, ensine a um amigo". Sabe-se que uma das melhores maneiras de consolidar material é explicar a alguém previamente estudado. A segunda razão - no processo de estudar esse padrão, não encontrei material que, pessoalmente, declarasse claramente a essência da Fábrica Abstrata (pelo menos em Habré).

Então, vamos começar. A primeira pergunta que você precisa responder estudando esse padrão: "O que é uma fábrica abstrata". A resposta mais simples e precisa é que a Abstract Factory é uma "fábrica de fábricas". Mas aqui surge uma segunda pergunta: “Por que alguém precisaria de uma“ fábrica de fábricas ”? Para responder, considere um exemplo da vida real.

Suponha que você decida assumir o controle total do mercado de automóveis. Como fazer isso? Você pode criar sua própria marca de carro, sua produção, conduzir uma empresa de publicidade em larga escala etc. Mas, neste caso, você tem que lutar com gigantes do mercado de automóveis como Toyota ou Ford. Não é fato que você sairá vitorioso dessa luta. Uma solução muito melhor seria comprar as fábricas de todas essas empresas, continuar produzindo carros com suas próprias marcas e colocar o lucro no seu bolso. Se não me engano, essa estrutura na economia é chamada de exploração. Esta participação será a Fábrica Abstrata ou "Fábrica de Fábricas". Em nosso programa, a fábrica Abstract (holding) será representada por uma interface ou uma classe abstrata. As empresas incluídas na holding são representadas por classes que implementam essa interface.

public interface CarsFactory { } public class ToyotaFactory implements CarsFactory {} public class FordFactory implements CarsFactory {} 

Em seguida, você reúne os gerentes de suas fábricas e diz: “A partir de agora, fabricaremos carros com 2 tipos de carroceria em nossas fábricas - um sedan e um cupê. Por exemplo, os japoneses farão ToyotaSedan e ToyotaCoupe, os americanos farão FordSedan e FordCoupe. ” E para que as fábricas não esqueçam exatamente o que precisa ser feito e não iniciem, por exemplo, SUVs, penduraremos os desenhos gerais do sedan e cupê no escritório de nossa holding em um local de destaque (em uma fábrica específica, os engenheiros descobrirão como fabricar os carros de que precisam). Assim, 2 métodos aparecem em nossa interface CarsFactory:

 public interface CarsFactory { Sedan createSedan(); Coupe createCoupe(); } 

Consequentemente, nas classes filho da interface CarsFactory, esses métodos também devem ser implementados.

 public class ToyotaFactory implements CarsFactory { @Override public Sedan createSedan() { return new ToyotaSedan(); } @Override public Coupe createCoupe() { return new ToyotaCoupe(); } } public class FordFactory implements CarsFactory { @Override public Sedan createSedan() { return new FordSedan(); } @Override public Coupe createCoupe() { return new FordCoupe(); } } 

Observe que o tipo do valor de retorno nos métodos será exatamente o tipo comum aos valores de retorno - sedan e cupê. Voltando à nossa analogia - você disse à fábrica para fabricar um sedan - você adquiriu um sedan. Recursos, como um sedan Ford, não são do seu interesse.

Como você pode adivinhar com facilidade no código acima, algumas entidades devem aparecer em nosso programa que descrevem tipos específicos de corpos - um sedan e um cupê. Essas entidades serão interfaces.

 public interface Sedan {} public interface Coupe {} 

E, é claro, esses desenhos devem ter uma modalidade específica na forma de carros criados em uma fábrica específica.

 public class ToyotaCoupe implements Coupe { public ToyotaCoupe() { System.out.println("Create ToyotaCoupe"); } } public class ToyotaSedan implements Sedan { public ToyotaSedan() { System.out.println("Create ToyotaSedan"); } } public class FordCoupe implements Coupe { public FordCoupe () { System.out.println("Create FordCoupe"); } } public class FordSedan implements Sedan { public FordSedan() { System.out.println("Create FordSedan"); } } 

Isso é tudo, nossa "fábrica de fábricas" capaz de produzir carros de qualquer marca e qualquer tipo está pronta. No futuro, você pode decidir que seria bom começar a produzir SUVs. Você precisará criar outra interface e pendurar um desenho de um SUV no escritório da holding (adicione o método necessário ao CarsFactory e implemente-o em fábricas subsidiárias). Também é possível que você decida capturar outra parte do mercado e comprar, por exemplo, todas as plantas da Nissan. Isso significa que você precisa criar outra classe que implemente o CarsFactory - NissanFactory e começar a produzir seus carros com essa marca (NissanCoupe, NissanSedan, etc.)

Mas como um usuário específico (comprador de carro) interage com nossa holding? O comprador geralmente não sabe que você confiscou todas as fábricas de automóveis do mundo. Ele chega ao pequeno escritório modesto da exploração e diz: "Eu preciso de um carro!" "Ótimo!" - dizemos a ele: - “você endereçou o endereço! Uma fábrica de fábricas é o que você precisa! ”

 CarsFactory factory; 

“Qual empresa de automóveis você prefere a essa hora do dia?”, Perguntamos. Suponha que um cliente queira comprar um Toyota. Não tem problema!

 factory = new ToyotaFactory(); 

"Que tipo de corpo você gostaria?" Digamos um sedan. “Ótima escolha!”

 factory.createSedan(); 

O carro está pronto, você pode ir!

Source: https://habr.com/ru/post/pt465835/


All Articles