Fábrica abstracta en los dedos

Me obligaron a escribir este artículo por dos razones. Más recientemente, me encontré con el patrón Abstract Factory. Como dice el dicho: "No sé cómo hacerlo usted mismo, enséñele a un amigo". Se sabe que una de las mejores formas de consolidar material es explicar a alguien previamente estudiado. La segunda razón: en el proceso de estudio de este patrón, no encontré material que para mí personalmente declararía claramente la esencia de la Fábrica abstracta (al menos en Habré).

Entonces comencemos. La primera pregunta que debe responderse estudiando este patrón: "¿Qué es una fábrica abstracta"? La respuesta más simple y precisa es que Abstract Factory es una "fábrica de fábricas". Pero aquí aparece una segunda pregunta: "¿Por qué alguien necesitaría incluso una" fábrica de fábricas "? Para responderlo, considere un ejemplo de la vida real.

Supongamos que decide tomar el control completo del mercado de automóviles. Como hacerlo Puede crear su propia marca de automóviles, su producción, dirigir una empresa de publicidad a gran escala, etc. Pero, en este caso, tienes que luchar con gigantes del mercado automovilístico como Toyota o Ford. No es un hecho que saldrás victorioso de esta lucha. Una solución mucho mejor sería comprar las fábricas de todas estas compañías, continuar produciendo automóviles con sus propias marcas y poner las ganancias en su bolsillo. Si no me equivoco, esa estructura en la economía se llama retención. Esta participación será la Fábrica abstracta o "Fábrica de fábricas". En nuestro programa, la fábrica abstracta (retención) estará representada por una interfaz o una clase abstracta. Las empresas incluidas en el holding están representadas por clases que implementan esta interfaz.

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

Luego, reúne a los gerentes de sus fábricas y dice: “A partir de ahora, fabricaremos automóviles con 2 tipos de carrocería en nuestras fábricas: un sedán y un cupé. Por ejemplo, los japoneses harán ToyotaSedan y ToyotaCoupe, los estadounidenses harán FordSedan y FordCoupe ". Y para que las fábricas no olviden qué es exactamente lo que se debe hacer y no comiencen, por ejemplo, los SUV, colgaremos los dibujos generales del sedán y el cupé en la oficina de nuestra explotación en el lugar más destacado (en la fábrica en particular, los ingenieros descubrirán cómo fabricar los autos que necesitan). Por lo tanto, aparecen 2 métodos en nuestra interfaz CarsFactory:

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

En consecuencia, en las clases secundarias de la interfaz CarsFactory, estos métodos también deben implementarse.

 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(); } } 

Tenga en cuenta que el tipo del valor de retorno en los métodos será exactamente el tipo común a los valores de retorno: sedán y cupé. Volviendo a nuestra analogía: le dijiste a la fábrica que hiciera un sedán, obtuviste un sedán. Las características, como un sedán Ford, no son de su interés.

Como puede adivinar fácilmente del código anterior, algunas entidades deberían aparecer en nuestro programa que describan tipos de cuerpo específicos: un sedán y un cupé. Estas entidades serán interfaces.

 public interface Sedan {} public interface Coupe {} 

Y, por supuesto, estos dibujos deben tener una realización específica en forma de automóviles creados en una fábrica en particular.

 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"); } } 

Eso es todo, nuestra "fábrica de fábricas" capaz de producir automóviles de cualquier marca y cualquier tipo está lista. En el futuro, puede decidir que sería bueno comenzar a producir SUV. Deberá crear otra interfaz y colgar un dibujo de un SUV en la oficina de la explotación (agregue el método requerido a CarsFactory e impleméntelo en fábricas subsidiarias). También es posible que decida capturar otra parte del mercado y comprar, por ejemplo, todas las plantas de Nissan. Esto significa que necesita crear otra clase que implemente CarsFactory - NissanFactory, y comenzar a producir sus automóviles bajo esta marca (NissanCoupe, NissanSedan, etc.)

Pero, ¿cómo interactuará un usuario específico (comprador de automóvil) con nuestra participación? El comprador generalmente no sabe que ha confiscado todas las fábricas de automóviles del mundo. Llega a la pequeña y modesta oficina de la explotación y dice: "¡Necesito un auto!" "¡Genial!" - le decimos, - “te has dirigido a la dirección! ¡Una fábrica de fábricas es lo que necesitas!

 CarsFactory factory; 

“¿Qué compañía de automóviles prefiere a esta hora del día?”, Preguntamos. Supongamos que un cliente quiere comprar un Toyota. No hay problema!

 factory = new ToyotaFactory(); 

"¿Qué tipo de cuerpo te gustaría?" Digamos un sedán. "Gran elección!"

 factory.createSedan(); 

¡El auto está listo, puedes irte!

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


All Articles