Modo de fábrica (actualiza el modo de fábrica anterior)

El modo de fábrica es adecuado para crear objetos complejos. Si puede usar directamente new para completar la creación del objeto, no necesita usar el modo de fábrica. Los componentes principales del modo
de fábrica
:

package ban.com;

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

Categoría de producto específica A:

package ban.com;

public class ConcreteProductCup extends Product {
    
    

    @Override
    void method() {
        System.out.println("Cup");

    }

}

Categoría de producto específica B:

package ban.com;

public class ConcreteProductSpoon extends Product {
    
    

    @Override
    void method() {
        System.out.println("Spoon");
    }

}

Clase de fábrica abstracta:

package ban.com;

public abstract class Factory {
    public abstract Product createProduct();
}

Clase de fábrica de hormigón:

package ban.com;

public class ConcreteFactory extends Factory{
    
    

    @Override
    public Product createProduct(){
        return new ConcreteProductSpoon();
    }

}

Clase de cliente:

package ban.com;

public class Client {
    public static void main(String[] args) {
        Factory factory=new ConcreteFactory();
        factory.createProduct().method();
    }
}

Los datos que se imprimirán son Spoon, que es un modelo de fábrica estándar. Si desea crear un objeto Cup, puede crear directamente una clase de implementación de fábrica para generar un objeto Cup.

package ban.com;

public class ConcreteFactory extends Factory{
    
    

    @Override
    public Product createProduct(){
        return new ConcreteProductCup();
    }

}

El modelo de fábrica se divide principalmente en cuatro módulos:
1. Fábrica abstracta: el núcleo del modelo de fábrica
2. Producto abstracto: la clase principal utilizada para crear el método de fábrica
3. La realización de la clase de fábrica específica: la lógica de creación específica
4 La realización de la clase de producto específica: La lógica única del producto

Parece que la clase de implementación de esa fábrica se creará si es necesario, pero el código es más y no conciso, por lo que podemos producir objetos de productos específicos de manera concisa de acuerdo con la forma de reflexión, y la parte genérica se usará aquí. (se actualizará en el conocimiento futuro de la parte genérica)
cambie la fábrica abstracta:

package ban.com;

public abstract class Factory {
    public abstract <T extends Product> T createProduct(Class<T> clz);
}

T es un tipo genérico heredado de Producto, el valor devuelto debe ser una subclase de Producto y el clz pasado es un objeto de clase.La implementación de fábrica
específica :

package ban.com;

public class ConcreteFactory extends Factory{
    
    

    @Override
    public <T extends Product> T createProduct(Class<T> clz) {
        Product product=null;
            try {
                //通过反射获取对象实例
                product=(Product) Class.forName(clz.getName()).newInstance();
            } catch (InstantiationException | IllegalAccessException
                    | ClassNotFoundException e) {
                e.printStackTrace();
            }
        return (T) product;//需是Product的子类
    }
}

De esta manera, puede asegurarse de que se puede obtener el objeto correspondiente pasando directamente el nombre de la clase requerida y cambiar el Cliente:

package ban.com;

public class Client {
    public static void main(String[] args) {
        Factory factory=new ConcreteFactory();
        factory.createProduct(ConcreteProductCup.class).method();
        factory.createProduct(ConcreteProductSpoon.class).method();
    }
}


El resultado impreso es: la ventaja de Cup Spoon es que puede generar los objetos requeridos de manera más concisa y dinámica.El método anterior se ha convertido en un método de múltiples fábricas y se puede utilizar.

Supongo que te gusta

Origin blog.csdn.net/u013377003/article/details/72864840
Recomendado
Clasificación