Patrón de diseño ilustrado: patrón de fábrica interesante

Método de fábrica Método de fábrica

En el patrón de fábrica, la relación entre las clases padre e hijo es como la de un molde en una fábrica de producción. La clase padre es responsable de especificar el método de generación de instancias y la subclase decide generar una clase específica. Todo el procesamiento específico es entregado a la subclase, con el propósito de realizar la producción. El marco de la instancia está desacoplado de la clase responsable de la producción de la instancia.

Programa de muestra

Echemos un vistazo al siguiente ejemplo para ver qué puede hacer el patrón de fábrica por nosotros.

Lista de clase

imagen-20221219192835521

paquete marco
Categoria de producto

Los productos se definen en el paquete framework, lo que significa que los objetos que implementan esta clase pueden convertirse en productos y pueden usarse.

public abstract class Product {
    
    
    public abstract void use();
}

clase de fábrica

En el marco también se define una fábrica, que se utiliza para crear productos y registrar productos.

public abstract class Factory {
    
    
    public final Product create(String owner) {
    
    
        Product product = createProduct(owner);
        registerProduct(product);
        return product;
    }

    protected abstract Product createProduct(String owner);

    protected abstract void registerProduct(Product product);
}
Paquete de tarjeta de identificación
tarjeta de identificación

La tarjeta de identificación hereda la clase de producto para reflejar el propósito de nuestra separación de marco.

public class IDcard extends Product {
    
    

    private String owner;

    IDcard(String owner) {
    
    
        System.out.println("制作" + owner + "的ID卡");
        this.owner = owner;
    }

    @Override
    public void use() {
    
    
        System.out.println("使用" + owner + "ID卡.");
    }

    public String getOwner() {
    
    
        return this.owner;
    }
}

IDCardFactory

Herede la clase de fábrica para producir productos y registrar productos.

public class IDCardFactory extends Factory {
    
    
    private List owners = new ArrayList();

    @Override
    protected Product createProduct(String owner) {
    
    
        return new IDcard(owner);
    }

    @Override
    protected void registerProduct(Product product) {
    
    
        owners.add(((IDcard) product).getOwner());
    }

    public List getOwners() {
    
    
        return owners;
    }
}

prueba
public class Test {
    
    
    public static void main(String[] args) {
    
    
        IDCardFactory factory = new IDCardFactory();
        Product card1 = factory.create("小红");
        Product card2 = factory.create("小明");
        Product card3 = factory.create("小刚");
        card1.use();
        card2.use();
        card3.use();

    }
}

imagen-20221219195521751

El papel del patrón de fábrica.

En el modo de fábrica, separamos los paquetes que escribimos, uno es el marco y el otro es la implementación específica.

El contenido de estos dos paquetes es paralelo como se muestra a continuación.

Diagrama de clase

imagen-20221219195837240

Rol del producto

Este rol pertenece al tipo de marco, que define la API que posee la instancia generada en el método de fábrica, y el procesamiento específico está determinado por el rol que hereda el producto.

creadorcreador

Creator también es un tipo de framework, se encarga de generar clases abstractas de objetos de producto, cómo generarlas está determinada por la subclase que hereda del creador.

HormigónProductoProducto específico

El tipo de procesamiento determina lo que se genera.

ConcreteCreator (creador específico)

El rol de ConcteteCreator pertenece a la Parte B que es responsable del procesamiento específico, es responsable del producto específico.

Ampliar ideas

Marco y procesamiento

Para apoyarnos, aprendimos sobre el marco y el procesamiento específico respectivamente, y los encapsulamos en dos paquetes respectivamente.

Podemos usar el mismo marco para desarrollar otros productos y fábricas. Por ejemplo, si queremos crear un televisor y una clase de fábrica para el televisor, debemos escribir el paquete de TV en el marco.

Aquí no necesitamos modificar el código en el paquete del marco, solo necesitamos modificar la clase de implementación correspondiente.

Tres métodos de implementación para generar métodos de instancia.

El método de generación de productos en el paquete de fábrica es un método abstracto, lo que significa que este método debe implementarse en una subclase. Generalmente hay tres formas de crear un producto.

  • Especificar un método abstracto
  • Implementar el procesamiento predeterminado. Si la autoclase no implementa un método, se procesará de forma predeterminada.
  • Lanza una excepción durante el procesamiento.
Consejos sobre patrones de uso y desarrollo.

Cuando se utilizan métodos de plantilla o patrones de fábrica en el desarrollo diario, resulta extremadamente importante aclarar la lógica porque es necesario leer el código de varias clases. Por lo general, al diseñar subclases en patrones de diseño, es necesario comunicarlas a las personas que desean Mantenga estas clases. Sea claro sobre sus intenciones. Las modificaciones no autorizadas pueden causar accidentes.

Ampliar el ejemplo

Agregue una identificación al producto (comenzando con 100) y espere que la identificación y el nombre del producto se almacenen en la estructura correspondiente.

Solo necesitamos cambiar la implementación específica.

public class IDcard extends Product {
    
    

    private String owner;
    private int idNum = 100;

    IDcard(String owner, int idNum) {
    
    
        System.out.println("制作" + owner + "(" + idNum + ")" + "的ID卡");
        this.owner = owner;
        this.idNum = idNum;
    }

    @Override
    public void use() {
    
    
        System.out.println("使用" + owner + "(" + idNum + ")" + "的ID卡");
    }


    public String getOwner() {
    
    
        return this.owner;
    }

    public int getIdNum() {
    
    
        return idNum;
    }
}

public class IDCardFactory extends Factory {
    
    
    //private List owners = new ArrayList();

    Map<Integer, String> idcard = new HashMap();
    private int idNum = 100;

    @Override
    protected synchronized Product createProduct(String owner) {
    
    
        return new IDcard(owner, idNum++);
    }

    @Override
    protected void registerProduct(Product product) {
    
    
        idcard.put(((IDcard) product).getIdNum(), ((IDcard) product).getOwner());
    }

    public Map<Integer, String> getIdcard() {
    
    
        return idcard;
    }

    //public List getOwners() {
    
    
    //    return owners;
    //}
}

imagen-20221219202704384

Podemos encontrar que no cambiamos el método de uso ni el marco, simplemente modificamos la implementación para completar el cambio en efecto, se puede ver que la idea del patrón de diseño es exquisita.

Supongo que te gusta

Origin blog.csdn.net/doomwatcher/article/details/128377362
Recomendado
Clasificación