Patrón abstracto de fábrica en Java

1. Información general

En este artículo, discutiremos el patrón de diseño de Abstract Factory.

El libro Design Patterns: Elements of Reusable Object-Oriented Software afirma que una fábrica abstracta "proporciona una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas". En otras palabras, este modelo nos permite crear objetos que siguen un patrón general.

Un ejemplo del patrón de diseño Abstract Factory en el JDK es newInstance () de la clase javax.xml.parsers.DocumentBuilderFactory .

2. Ejemplo de patrón de diseño abstracto de fábrica

En este ejemplo, crearemos dos implementaciones del patrón Factory Method Design: AnimalFactory y Color Factory.

Después de eso, administraremos el acceso a ellos usando Abstract Factory AbstractFactory:

Primero, crearemos una familia de la clase Animal y, más adelante, la usaremos en nuestra Fábrica abstracta.

Aquí está la interfaz Animal :

public interface Animal { String getAnimal(); String makeSound(); }

y una implementación concreta Duck :

public class Duck implements Animal { @Override public String getAnimal() { return "Duck"; } @Override public String makeSound() { return "Squeks"; } } 

Además, podemos crear implementaciones más concretas de la interfaz Animal (como Dog, Bear, etc.) exactamente de esta manera.

Abstract Factory se ocupa de familias de objetos dependientes. Con eso en mente, vamos a presentar una familia de colores más como interfaz con algunas implementaciones ( blanco, marrón,… ).

Saltaremos el código real por ahora, pero se puede encontrar aquí.

Ahora que tenemos varias familias listas, podemos crear una interfaz AbstractFactory para ellas:

public interface AbstractFactory { T create(String animalType) ; }

A continuación, implementaremos un AnimalFactory usando el patrón de diseño del método Factory que discutimos en la sección anterior:

public class AnimalFactory implements AbstractFactory { @Override public Animal create(String animalType) { if ("Dog".equalsIgnoreCase(animalType)) { return new Dog(); } else if ("Duck".equalsIgnoreCase(animalType)) { return new Duck(); } return null; } } 

Del mismo modo, podemos implementar una fábrica para la interfaz de color utilizando el mismo patrón de diseño.

Cuando todo esto esté configurado, crearemos una clase FactoryProvider que nos proporcionará una implementación de AnimalFactory o ColorFactory dependiendo del argumento que proporcionemos al método getFactory () :

public class FactoryProvider { public static AbstractFactory getFactory(String choice){ if("Animal".equalsIgnoreCase(choice)){ return new AnimalFactory(); } else if("Color".equalsIgnoreCase(choice)){ return new ColorFactory(); } return null; } }

3. Cuándo utilizar el patrón Abstract Factory:

  • El cliente es independiente de cómo creamos y componimos los objetos en el sistema.
  • El sistema consta de varias familias de objetos, y estas familias están diseñadas para usarse juntas
  • Necesitamos un valor en tiempo de ejecución para construir una dependencia particular

Si bien el patrón es excelente cuando se crean objetos predefinidos, agregar los nuevos puede ser un desafío . Para admitir el nuevo tipo de objetos, será necesario cambiar la clase AbstractFactory y todas sus subclases.

4. Resumen

En este artículo, aprendimos sobre el patrón de diseño Abstract Factory.

Finalmente, como siempre, la implementación de estos ejemplos se puede encontrar en GitHub.