Notas de estudio del modo de diseño --- 1. Modo de fábrica simple

  • Este patrón de diseño es más como un selector, todos lo han usado pero el concepto es relativamente vago;

  • Este tipo de patrón de diseño pertenece al modo de creación, que proporciona una forma óptima de crear objetos. En el modo de fábrica, cuando creamos un objeto, no expondremos la lógica de creación al cliente y señalaremos el objeto recién creado a través de una interfaz común;

  • Intención: definir una interfaz para crear objetos, dejar que sus subclases decidan qué clase de fábrica, el modo de fábrica usa su proceso de creación para retrasar hasta la subclase;

  • Solución principal: resolver principalmente el problema de la selección de la interfaz;

  • Cuándo usar: Planeamos explícitamente crear diferentes instancias bajo diferentes condiciones;

  • Cómo resolverlo: deje que su subclase implemente la interfaz de fábrica, y el producto devuelto también es un producto abstracto;

  • Código clave: el proceso de creación se lleva a cabo en sus subclases;

  • Ejemplos de aplicación:

    • 1. Necesita un automóvil, puede recoger directamente los productos de la fábrica, independientemente de cómo se fabrica el automóvil y la implementación específica en este automóvil;

    • 2. Hibernate solo necesita cambiar el dialecto y el controlador para cambiar la base de datos;

  • Ventaja

    • 1. Una persona que llama que quiere crear un objeto solo necesita saber el nombre;

    • 2. Alta escalabilidad, si desea agregar un producto, solo necesita expandir una clase de fábrica;

    • 3. La implementación específica del producto de protección, la persona que llama solo se preocupa por la interfaz del producto;

  • Desventajas: cada vez que agrega un producto, debe agregar una clase y un objeto específicos para lograr la fábrica, de modo que el número de clases en el sistema aumenta exponencialmente, lo que aumenta la complejidad del sistema en cierta medida, y también aumenta las clases específicas del sistema. Depende de

  • Escenario de uso:

    • 1. Grabador de registros: los registros pueden grabarse en discos locales, eventos del sistema, servidores remotos, etc. El usuario sabe dónde elegir la fecha de grabación;

    • 2. Acceso a la base de datos, cuando el usuario no sabe qué tipo de base de datos utiliza el sistema al final, y la base de datos puede cambiar;

    • 3. Para diseñar un marco para conectarse al servidor, se requieren tres protocolos, "POP3", "IMAP" y "HTTP". Estos tres se pueden utilizar como categorías de productos para implementar conjuntamente una interfaz;

  • Asuntos que requieren atención:

    • Como un patrón de clase de creación, el patrón de método de fábrica se puede usar donde sea que se deban generar objetos complejos. Una cosa a tener en cuenta es que los objetos complejos son adecuados para usar el patrón de fábrica, mientras que los objetos simples, especialmente los objetos que pueden ser creados solo por nuevos, sin usar el patrón de fábrica, necesita introducir una clase de fábrica, lo que aumentará la complejidad del sistema;

  • Combate real

    • Implementaremos una interfaz Shape y una clase de entidad que implementa la interfaz Shape. El siguiente paso es la clase de fábrica ShapeFactory;

    • FactoryPatternDemo, la clase de demostración utiliza ShapeFactory para obtener objetos Shape.

 

Enlace de código

 

package factorypattern;

/**
 * @author yangxin_ryan
 * create Circle Class
 */
public class Circle implements Shape {

    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

 

package factorypattern;

/**
 * @author yangxin_ryan
 * create FactoryPatternDemo Class
 */
public class FactoryPatternDemo {

    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();
        Shape shape1 = shapeFactory.getShape("CIRCLE");
        shape1.draw();
        Shape shape2 = shapeFactory.getShape("RECTANGLE");
        shape2.draw();
        Shape shape3 = shapeFactory.getShape("SQUARE");
        shape3.draw();
    }

}

 

package factorypattern;

/**
 * @author yangxin_ryan
 * Create Rectangle class
 */
public class Rectangle implements Shape {

    public void draw() {
        System.out.println("Inside Rectangle::draw() method");
    }
}
package factorypattern;

/**
 * @author yangxin_ryan
 * Create interface Shape
 */
public interface Shape {
    void draw();
}

 

package factorypattern;

/**
 * @author yangxin_ryan 
 * Create ShapeFactory class
 */
public class ShapeFactory {

    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }
}

 

package factorypattern;

/**
 * @author yangxin_ryan
 * create a Square Class
 */
public class Square implements Shape {

    public void draw() {
        System.out.println("Inside Square::draw() method.");
    }
}

Resultados de ejecución:

Artículos originales publicados en 1980 · elogiados 708 · 3.66 millones de visitas +

Supongo que te gusta

Origin blog.csdn.net/u012965373/article/details/105581520
Recomendado
Clasificación