Patrón de fábrica abstracto detallado

1. Introducción

Abstract Factory Pattern (Patrón de fábrica abstracto) también es un patrón de diseño creacional, que proporciona una interfaz de fábrica (superfábrica) que crea una serie de objetos relacionados o dependientes. Diferentes tipos de fábricas luego implementan esta fábrica abstracta y, finalmente, una clase creadora de fábrica. se puede proporcionar para crear fábricas específicas pasando parámetros de tipo de fábrica. Es una extensión del patrón del método de fábrica . La idea central es abstraer la propia fábrica. Su objetivo principal es crear otras fábricas alrededor de una superfábrica o fábrica central. Esta superfábrica también se llama la fábrica de otras fábricas.

La diferencia entre este y el patrón de método de fábrica es que el patrón de método de fábrica está dirigido a un nivel de producto, mientras que el patrón de fábrica abstracto está dirigido a múltiples niveles de producto, es decir, una familia de productos. En programación, normalmente un nivel de producto se representa como una interfaz o clase abstracta y su clase de implementación, es decir, todos los productos proporcionados por el patrón de método de fábrica se derivan de la misma interfaz o clase abstracta, y el patrón de fábrica abstracto Los productos proporcionados se derivan de diferentes interfaces o clases abstractas.

La llamada familia de productos se refiere a una familia compuesta por productos funcionalmente relacionados ubicados en diferentes niveles de productos. Una serie de productos proporcionados por el patrón abstracto de fábrica forman una familia de productos, y una serie de productos proporcionados por el método de fábrica forman un nivel de producto.

En comparación con la vida real, una familia de productos, como productos digitales. Una clase de producto, como los teléfonos móviles, incluye todas las marcas de teléfonos móviles que pertenecen a esta clase de producto y todas las computadoras portátiles pertenecen a otra clase de producto. Todos los teléfonos móviles y computadoras juntos constituyen la familia de productos de productos digitales.

Principio de diseño

El patrón de fábrica abstracto generalmente contiene cuatro roles obligatorios y un rol opcional:

  • Abstract Factory (Abstract Factory): define una interfaz o clase abstracta que declara un conjunto de métodos para crear objetos de productos relacionados. El valor de retorno de estos métodos suele ser un producto abstracto.
  • Fábrica concreta: implementa el método de creación de objetos de producto declarados en la fábrica abstracta y crea un objeto de producto específico de acuerdo con diferentes parámetros de producto en el mismo nivel de producto.
  • Producto abstracto (Abstract Product): Define una interfaz o clase abstracta para representar productos similares, y declara los métodos que tiene el producto en el producto abstracto.
  • Producto concreto: define los productos específicos propiedad del producto abstracto e implementa los métodos comerciales definidos en la interfaz del producto abstracto.
  • Creador de fábrica (función opcional): proporcione un método estático para crear una clase de fábrica específica de acuerdo con los diferentes parámetros de tipo de fábrica que se pasan, y la fábrica abstracta recibe el valor de retorno.

diagrama de clases UML
inserte la descripción de la imagen aquí

Análisis de escalabilidad

Consejo: muchos artículos escriben sobre la ampliación de una familia de productos. No entiendo muy bien esta afirmación. El patrón de fábrica abstracto corresponde a una sola familia de productos. Creo que debería ser una cuestión de comprensión china. Solo se puede decir que expanda una familia de productos, no una familia de productos. Lo primero significa que quiero agregar un nivel de producto en una familia de productos, y lo segundo significa que quiero para agregar una nueva familia de productos, esto no es una expansión, sino un nuevo comienzo. Así es como lo entiendo, y todos son bienvenidos a cuestionarlo.

ampliar un producto

Un producto específico necesita ser expandido. Al mismo tiempo, modifica parte del código de la capa de fábrica específica. Una pequeña violación del principio abierto-cerrado.

Ampliar una clase de producto

Tanto la capa de producto abstracto como la capa de producto concreto deben ampliarse. También es necesario modificar la capa de fábrica abstracta de nivel superior para agregar métodos de creación adicionales, lo que hará que todas las implementaciones de fábrica concretas se modifiquen sincrónicamente, lo que es muy problemático y viola en gran medida el principio de apertura y cierre.

ventaja

  • Separar la creación y el uso de productos hace que el código del cliente sea más conciso y oculta al cliente los detalles de la creación del producto.
  • Unifique la creación de una serie de objetos de productos relacionados en una fábrica abstracta, el cliente solo necesita acceder a la fábrica abstracta y la fábrica de productos específica se puede reemplazar de manera flexible.
  • Cuando se diseñan varios objetos de una familia para que funcionen juntos, se garantiza que los clientes siempre utilizarán únicamente objetos de la misma familia.

defecto

  • Es muy difícil agregar un nuevo nivel de producto bajo una familia de productos, incluso necesita modificar el código de la capa de abstracción y todas las implementaciones debajo de él, lo que viola gravemente el "principio abierto-cerrado".
  • Aumenta la complejidad del código, aumenta la abstracción del sistema y aumenta la dificultad de comprensión.

escena aplicable

  • Un sistema requiere una serie de objetos de producto relacionados o interdependientes, y la implementación de estos objetos de producto puede cambiar con el tiempo.
  • El sistema necesita seleccionar dinámicamente uno de una familia de productos en tiempo de ejecución, en lugar de un solo producto.
  • El sistema debe asegurarse de que un conjunto de objetos de productos estén diseñados para usarse juntos, no individualmente.
  • El sistema debe proporcionar una interfaz de acceso unificado para diferentes productos de una familia de productos, independientemente de la implementación específica del producto.

2. Caso de realización

Simule una familia de productos, que incluye dos niveles de producto de "forma" y "color", y proporcione los métodos de creación correspondientes.

1. Capa de producto abstracto y capa de producto concreto que representan "forma"

Sugerencia: tenga en cuenta que aquí hay una interfaz y dos clases de implementación, que se definen conjuntamente en un archivo Shape.java. Lo mismo a continuación.

public interface Shape {
    
    
    void draw();
}

class Square implements Shape{
    
    
    @Override
    public void draw() {
    
    
        System.out.println("我是正方形");
    } 
}

class Circle implements Shape{
    
    
    @Override
    public void draw() {
    
    
        System.out.println("我是圆形");
    }
}

2. Capa de producto abstracto y capa de producto concreto que representa "color"

public interface Color {
    
    
    void fill();
}

class Red implements Color{
    
    
    @Override
    public void fill() {
    
    
        System.out.println("我是红色");
    }   
}

class Blue implements Color{
    
    
    @Override
    public void fill() {
    
    
        System.out.println("我是蓝色");
    }  
}

3. Fábrica abstracta y capa de fábrica de hormigón.

//抽象工厂类
public interface AbstractFactory {
    
    
    Shape getShape(String shape);
    Color getColor(String color);
}
//形状工厂类
class ShapeFactory implements AbstractFactory {
    
    
    @Override
    public Shape getShape(String shape){
    
          
       if("square".equalsIgnoreCase(shape)){
    
    
          return new Square();
       } else if("circle".equalsIgnoreCase(shape)){
    
    
          return new Circle();
       }else{
    
    
            return null;
       }
    }
    @Override
    public Color getColor(String color) {
    
    
       return null;
    }
 }
//颜色工厂类
 class ColorFactory implements AbstractFactory {
    
    
    @Override
    public Shape getShape(String shape){
    
          
        return null;
    }
    @Override
    public Color getColor(String color) {
    
    
        if("red".equalsIgnoreCase(color)){
    
    
            return new Red();
         } else if("blue".equalsIgnoreCase(color)){
    
    
            return new Blue();
         }else{
    
    
            return null;
         }
     }
 }

5. Creador de fábrica

public class FactoryProducer {
    
    
    //工厂创造器
    public static AbstractFactory createFactory(String choice){
    
    
        if("shape".equalsIgnoreCase(choice)){
    
    
           return new ShapeFactory();
        } else if("color".equalsIgnoreCase(choice)){
    
    
           return new ColorFactory();
        }else{
    
    
            return null;
        }
     }
}

6. Clase de prueba

public class Test {
    
    
    public static void main(String[] args) {
    
    
        //测试形状工厂
        AbstractFactory absFactory01=FactoryProducer.createFactory("shape");
        absFactory01.getShape("circle").draw();

        //测试颜色工厂
        AbstractFactory absFactory02=FactoryProducer.createFactory("color");
        absFactory02.getColor("red").fill();

        //不使用工厂创造器,直接new的形式
        AbstractFactory absFactory03=new ColorFactory();
        absFactory03.getColor("blue").fill();
    }
}

Ejemplo de ejecución de resultados:

imagen-20230430141636899

3. Resumen

Bueno, queridos lectores y amigos, gracias por su arduo trabajo Después de estudiar esta publicación de blog, creo que tienen una comprensión muy profunda del modelo de fábrica abstracta. En comparación con el modo de método de fábrica, este modo es de hecho más complicado y difícil de entender. Este artículo trata de explicar el principio de diseño, la escalabilidad, las ventajas y desventajas del modo de fábrica abstracto de una forma fácil de entender. Espero que pueda comprenda su uso cuidadosamente en combinación con el caso. Las preguntas son bienvenidas para comentar.


La creación no es fácil. Si este artículo es útil para usted, por favor, marque como favorito y preste atención. Su apoyo y aliento son la mayor motivación para mi creación.

Supongo que te gusta

Origin blog.csdn.net/qq_36756227/article/details/130450108
Recomendado
Clasificación