[Ensayo sobre el estereotipo de una entrevista en Java] Patrones de diseño

  navegación: 

[Dark Horse Java Notes + Stepping on the Pit Summary] JavaSE+JavaWeb+SSM+SpringBoot+Riji Takeaway+SpringCloud+Dark Horse Tourism+Guli Mall+Xuecheng Online+Design Mode+Nioke Interview Questions

Tabla de contenido

Hable acerca de su comprensión de los patrones de diseño?

Hable acerca de su comprensión del patrón singleton.

Escribir un patrón singleton a mano

Hable acerca de su comprensión del modelo de fábrica?

Anote el patrón de fábrica

Hable acerca de su comprensión del modelo proxy?

Hable acerca de su comprensión del modo de plantilla?

Hable acerca de su comprensión del patrón del observador.

¿Hablar de los patrones de diseño usados ​​en JDK?

¿Hablar de los patrones de diseño usados ​​en Spring?


Hable acerca de su comprensión de los patrones de diseño?

Palabras clave: experiencia de diseño resumida, soluciones generales, mantenibilidad, escalabilidad general, reducción de complejidad, análisis específico de problemas específicos; siete principios, tres tipos.

Patrones de diseño:

Los patrones de diseño son experiencias útiles que los programadores han resumido frente a problemas similares de diseño de ingeniería de software . Los patrones no son códigos, sino soluciones generales para ciertos tipos de problemas , y los patrones de diseño representan las mejores prácticas. Estas soluciones son el resultado del ensayo y error de numerosos desarrolladores de software durante un período de tiempo considerable.

La naturaleza de los patrones de diseño mejora la capacidad de mantenimiento, la versatilidad y la escalabilidad del software , y reduce la complejidad del software.

El uso excesivo de patrones de diseño puede conducir a una abstracción excesiva del código, aumentando la dificultad del mantenimiento del código y los costos de aprendizaje. Por lo tanto, al usar patrones de diseño, debe elegir de acuerdo con las necesidades específicas del proyecto y las condiciones reales .

Siete principios:

  • Principio de responsabilidad única: una clase debe ser responsable de una sola responsabilidad. Mejore la legibilidad y la mantenibilidad, reduzca el acoplamiento.
  • Principio de segregación de interfaces: Las dependencias entre clases deben establecerse en la interfaz más pequeña. Por ejemplo, la clase de implementación solo puede usar algunos métodos de la interfaz.Para reducir la redundancia y mejorar la capacidad de mantenimiento, la interfaz original debe dividirse y combinarse razonablemente.
  • Principio de inversión de dependencia: los módulos de alto y bajo nivel deben depender de abstracciones, y los detalles deben depender de abstracciones.
  • Principio de sustitución de Liskov: después de que el objeto de tipo principal se reemplaza por el objeto de subtipo, la función permanece sin cambios y el método de la clase principal no debe reescribirse en la subclase tanto como sea posible.
  • Principio abierto-cerrado: el software está abierto para la extensión y cerrado para la modificación. Mejorar la escalabilidad y la mantenibilidad.
  • Ley de Dimit: el principio del mínimo conocimiento, cuanto menos sepa una clase sobre las clases de las que depende, mejor, y solo se comunica con amigos directos (variables miembro, parámetros de método, clases de valor de retorno de métodos).
  • El principio de la reutilización sintética: intente utilizar la síntesis/agregación en lugar de la herencia. Es decir, la clase que debe usarse se usa como parámetro, variable miembro y variable local de esta clase.

Tipo de patrón de diseño:

  • Modo de creación: se utiliza para la creación de objetos, incluidos los modos singleton, factory y otros.
  • Patrón estructural: se utiliza para describir la relación de composición entre objetos, incluidos patrones como agentes
  • Patrones de comportamiento: Se utilizan para describir la comunicación y asignación de responsabilidades entre objetos. Incluyendo métodos de plantilla, observadores, cadena de responsabilidad y otros patrones

Hable acerca de su comprensión del patrón singleton.

Palabras clave: concepto (una instancia, un método estático), implementación, ventajas y desventajas (ahorro de recursos, evitar la creación repetida de objetos, gestión de variables globales, prestar atención a la seguridad de subprocesos), escenarios (objetos pesados)

Asegúrese de que una clase tenga solo una instancia y proporcione solo un método estático para obtener una instancia de objeto.

Método de implementación: hombre perezoso hambriento, verificación doble, clase interna estática, enumeración.

ventaja:

  • Ahorro de recursos: solo hay una instancia del patrón singleton, que puede evitar la creación repetida de objetos , ahorrando así recursos y mejorando el rendimiento del sistema.
  • Administrar variables globales: el patrón singleton se puede usar para administrar el estado global y las variables para facilitar el intercambio de datos en todo el sistema .
  • Simplificar la arquitectura del sistema: el uso del patrón singleton puede simplificar la arquitectura del sistema, reducir la cantidad de clases y la complejidad de la interfaz.

defecto:

  1. Puede causar problemas de simultaneidad: cuando el modo singleton se usa en subprocesos múltiples, debe garantizar la seguridad de los subprocesos; de lo contrario, puede causar problemas de simultaneidad.
  2. Puede aumentar la complejidad del sistema: el uso excesivo del patrón singleton puede aumentar la complejidad del sistema, lo que dificulta el mantenimiento del código.
  3. Difícil de depurar: debido al estado compartido global del modo singleton, puede causar problemas durante la depuración que son difíciles de localizar y probar.

Escenas a utilizar:

Objetos que deben crearse y destruirse con frecuencia , objetos que tardan demasiado en crearse o consumen demasiados recursos pero que se usan con frecuencia (es decir, objetos pesados), objetos de herramientas, objetos que acceden con frecuencia a bases de datos o archivos (como fuentes de datos, fábrica de sesiones, etc.)
 

Escribir un patrón singleton a mano

Método de implementación: hombre perezoso hambriento, verificación doble, clase interna estática, enumeración.

Hungry Man (versión constante estática): seguro para subprocesos, desperdiciará memoria si no se usa.

public class Singleton {
    // 1、构造器私有化
    private Singleton() {
    }

    // 2、类的内部创建对象
    private static final Singleton instance = new Singleton();

    // 3、向外暴露一个静态的公共方法
    public static Singleton getInstance() {
        return instance;
    }
}

Lazy (versión de método síncrono): carga diferida, seguro para subprocesos, pero de baja eficiencia (bloqueo cada vez que se adquiere una instancia), no recomendado.

public class Singleton {
    // 1、构造器私有化
    private Singleton() {
    }

    // 2、类的内部声明对象
    private static Singleton instance;

    // 3、向外暴露一个静态的公共方法,加入同步处理的代码,解决线程安全问题
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

Verificación doble: seguridad de subprocesos, carga diferida

public class Singleton {
    // 1、构造器私有化
    private Singleton() {
    }

    // 2、类的内部声明对象,同时用`volatile`关键字修饰,为了保证可见性。
//原子性、可见性(修改立即更新到内存)、有序性
    private static volatile Singleton instance;

    // 3、向外暴露一个静态的公共方法,加入同步处理的代码块,并进行双重判断,解决线程安全问题
    public static Singleton getInstance() {
        if (instance == null) {    //第一次检查,可能有多个线程同时通过检查
//类级别的锁对象,锁对象是全局的,对该类的所有实例均有效。回顾锁对象是this时仅限于锁当前实例
            synchronized (Singleton.class) {    
                if (instance == null) {   //第二次检查,只会有1个线程通过检查并创建实例
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

Clase interna estática: seguridad de subprocesos, carga diferida, alta eficiencia.

public class Singleton {
    // 1、构造器私有化
    private Singleton() {
    }

    // 2、定义一个静态内部类,内部定义当前类的静态属性
    private static class SingletonInstance {
        private static final Singleton instance = new Singleton();
    }

    // 3、向外暴露一个静态的公共方法
    public static Singleton getInstance() {
        return SingletonInstance.instance;
    }
}

Enumeraciones: seguridad para subprocesos, carga diferida.

public enum Singleton {
    INSTANCE;
}

Hable acerca de su comprensión del modelo de fábrica?

Palabras clave: la clase de fábrica crea objetos, fábricas, fábricas abstractas, reutilización y mantenibilidad, análisis específico de problemas específicos.

Mejore la mantenibilidad y la reutilización a costa de una mayor complejidad. 

El patrón de fábrica es un patrón de diseño creacional , que resuelve principalmente los problemas de flexibilidad y mantenibilidad en el proceso de creación de objetos . El patrón de fábrica permite que la clase de fábrica sea responsable de crear y devolver objetos sin exponer la lógica de creación de objetos , lo que reduce el acoplamiento del código.

Patrón de fábrica simple 

El patrón de fábrica simple es crear una instancia de objeto a través del método estático de la clase de fábrica (abstracto o no abstracto) y usar la instancia como el valor de retorno del método. Cuando está en uso, solo necesita llamar a este método estático para crear un objeto sin crear una instancia de la clase de fábrica.

patrón de método de fábrica

El patrón del método de fábrica es definir un método abstracto para crear un objeto de producto abstracto en una clase de fábrica abstracta , y la clase de fábrica específica determina la clase de producto que se instanciará. El método abstracto de "crear un objeto de producto abstracto" se llama en el constructor de la clase de fábrica abstracta, y la clase de fábrica concreta anula el método abstracto para instanciar la clase de producto específica según la situación. Al usarlo, cree directamente un objeto de fábrica específico y ejecute el constructor de clase de ingeniería abstracta para llamar al método de creación reescrito para crear un objeto de producto específico.

Una clase de fábrica abstracta puede derivar varias clases de fábrica concretas. Cada clase de fábrica específica solo puede crear una instancia de una clase de producto específica. Una clase de producto abstracto puede derivar múltiples clases de productos concretos. 

patrón de fábrica abstracto

El patrón de fábrica abstracta se define en la interfaz de fábrica abstracta para crear objetos de producto abstractos , y cada clase de fábrica específica crea objetos de producto específicos según el escenario.

Una clase de fábrica abstracta puede derivar varias clases de fábrica concretas. Cada clase de fábrica específica puede crear varias instancias de clases de productos específicas. Múltiples clases de productos abstractos, cada clase de producto abstracto puede derivar múltiples clases de productos concretos.

Ventajas:
1. Puede evitar el acoplamiento causado por el uso directo de la nueva palabra clave para crear objetos, lo que mejora la capacidad de mantenimiento
del código 2. La lógica de creación de objetos se puede encapsular en una clase de fábrica, lo que mejora la reutilización del código ;
3. La lógica de creación de objetos se puede gestionar de forma unificada para facilitar el mantenimiento y las actualizaciones del código.

Desventajas:
1. Aumenta la complejidad del código, necesita crear una clase de fábrica, lo que aumentará el tamaño del código ;
2. Si la clase de producto cambia, debe modificar la clase de fábrica, lo que puede afectar las funciones de otros códigos .

En resumen, el patrón de fábrica es un patrón de diseño de creación de uso común, que puede mejorar la capacidad de mantenimiento, la reutilización y la flexibilidad del código. Sin embargo, debe sopesar los pros y los contras al usarlo para evitar un uso excesivo y aumentar la complejidad del código.

Anote el patrón de fábrica

Patrón de fábrica simple:

//简单静态工厂
public class PizzaFactory {
    public static Pizza createPizza2(String orderType) {
        Pizza pizza = null;
        switch (orderType) {
            case "cheese":
                pizza = new CheesePizza();
                break;
            case "greek":
                pizza = new GreekPizza();
                break;
            case "pepper":
                pizza = new PepperPizza();
                break;
            default:
                break;
        }
        return pizza;
    }
}
//订购披萨类
public class OrderPizza {
    public OrderPizza() {
        Pizza pizza=null;
        do {
//直接通过静态方法创建工厂对象,不用再像之前通过“构造器参数赋值成员变量”方式创建对象。
            pizza = PizzaFactory.createPizza(getType());    
            if (pizza == null) {
                System.out.println("Failed to Order Pizza");
            } else {
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            }
        } while (true);
    }
}

 

Hable acerca de su comprensión del modelo proxy?

Palabras clave: estructural, objeto proxy, mejora, control remoto de objetos, control de seguridad, proxy estático , misma interfaz de proxy, JDK Dynamic Proxy , reflexión, memoria, fábrica de proxy, Proxy.newProxyInstance(), Spring AOP, proxy Cglib , objeto de subclase, proxy fábrica, marco ASM, método intercept() de la interfaz MethodInterceptor, clase de herramienta Enhancer del paquete cglib

El patrón proxy es un patrón de diseño estructural (utilizado para describir la relación de composición entre objetos).

Modo proxy: Proporcione un sustituto de un objeto para controlar el acceso a este objeto. Es decir, se accede al objeto de destino a través del objeto proxy.

beneficio:

En función de la realización del objeto de destino, se pueden mejorar las operaciones funcionales adicionales, es decir, la función del objeto de destino se puede ampliar

Los objetos proxy pueden ser objetos remotos , objetos que son costosos de crear u objetos que requieren control de seguridad . (Control de seguridad del objeto de destino al hacer proxy)

Proxy estático:

El objeto de destino y el objeto proxy implementan la misma interfaz o heredan la misma clase principal, y el objeto proxy se genera en tiempo de compilación.

El objeto de destino implementa la interfaz de proxy, el objeto de proxy implementa y agrega la interfaz de proxy y el método de reescritura escribe la lógica mejorada.

Proxy dinámico JDK:

Los objetos proxy se generan dinámicamente en la memoria en tiempo de ejecución a través del mecanismo de reflexión de Java. El objeto de destino necesita implementar la interfaz de proxy.

El objeto de destino implementa la interfaz de proxy y la fábrica de proxy utiliza el método estático newProxyInstance() de la clase Proxy para devolver la instancia del objeto proxy a través del mecanismo de reflexión.  

newProxyInstance() tiene tres parámetros: el cargador de clases del objeto de destino, la interfaz del objeto de destino, implementar la interfaz InvocationHandler y reescribir el método de invocación(), y escribir la lógica del objeto proxy.

Spring AOP adopta el método de proxy dinámico JDK para crear dinámicamente objetos de proxy en tiempo de ejecución para lograr mejoras.

Proxy cglib:

Construya un objeto de subclase en la memoria para realizar la extensión de la función del objeto de destino. El objeto de destino no necesita implementar la interfaz de proxy. La capa inferior es para convertir el código de bytes y generar nuevas clases utilizando el marco ASM.

La clase de fábrica de proxy implementa la interfaz MethodInterceptor y reescribe el método intercept() para escribir la lógica de proxy y devuelve la instancia del objeto de proxy configurando el archivo de código de bytes de la clase principal y creando el objeto de subclase a través de la clase Enhancer del paquete cglib.

El marco ASM es un poderoso marco de manipulación de código de bytes de Java que permite a los programadores manipular clases de Java a través de la generación de código y la conversión de códigos de bytes existentes. ASM puede generar código de bytes directamente o modificar el código de bytes existente accediendo a él.

Hable acerca de su comprensión del modo de plantilla?

introducir:

Los patrones de plantilla son patrones de comportamiento (utilizados para describir la comunicación y la asignación de responsabilidades entre objetos).

Define un framework o esqueleto de algoritmo, aplazando algunos pasos a la implementación en subclases.

Método de implementación: la clase abstracta tiene un método de plantilla y otros métodos de comportamiento. El método de plantilla llama a cada método de comportamiento (abstracto o no abstracto) según el proceso; la subclase concreta anula el método de comportamiento abstracto. 

ventaja:

  1. Dado que el esqueleto del algoritmo se implementa en la clase padre o clase abstracta, es posible evitar escribir el mismo código repetidamente en cada subclase, lo que mejora la reutilización y mantenibilidad del código ;
  2. Debido a que las subclases solo necesitan implementar partes específicas sin modificar la estructura general del algoritmo, se puede mejorar la seguridad y la escalabilidad del código;
  3. La estructura y el flujo de ejecución del algoritmo se pueden controlar en la clase principal o en la clase abstracta, para garantizar la coherencia y la estabilidad del algoritmo .

 

Hable acerca de su comprensión del patrón del observador.

Palabras clave: Comportamiento, uno a muchos, dos interfaces, tema, registro, eliminación, notificación de actualización del observador; observador, actualización; acoplamiento, principio abierto-cerrado, complejidad; JDK, Observable, Observer

El patrón de observador es un patrón de diseño de comportamiento ( utilizado para describir la comunicación y la asignación de responsabilidades entre objetos ) , que define una relación de dependencia de uno a muchos entre objetos, de modo que cuando cambia el estado del objeto sujeto, todos dependen de él Observador los objetos pueden ser notificados y actualizados automáticamente

Implementación:

El objeto del tema implementa los métodos de registro, eliminación y notificación de la interfaz del tema y administra la lista de recursos y observadores;

El objeto observador implementa el método de actualización de la interfaz del observador y administra los recursos;

Método de notificación de objeto sujeto: recorrer la lista de observadores y ejecutar el método de actualización.

ventaja:

1. Se reduce el grado de acoplamiento entre objetos , porque el objeto sujeto no necesita saber la implementación específica del observador, sino que solo necesita saber que el observador implementa una interfaz específica.

2. La lista de observadores se puede expandir dinámicamente , lo cual es conveniente y flexible.

3. Se realiza la dependencia de uno a muchos entre objetos, lo que mejora la mantenibilidad y la reutilización del sistema . Cumple con el principio ocp (principio abierto-cerrado : abierto para extensión, cerrado para modificación).

Desventajas :

1. Cuando hay demasiados observadores, el proceso de notificación lleva mucho tiempo, lo que afectará el rendimiento del sistema.

2. Si existe una dependencia circular entre el observador y el objeto sujeto, puede ocurrir un bucle infinito .

JDK proporciona la clase abstracta de sujeto y la interfaz de observador de las funciones básicas del modo observador:

La clase abstracta Observable simplemente implementa las funciones básicas del objeto del tema (registro, eliminación, notificación);

Observer es la interfaz del observador y tiene un método update().

¿Hablar de los patrones de diseño usados ​​en JDK?

Patrón de fábrica simple estático 

En la clase Calendario, se usa un patrón de fábrica simple y estático: un objeto de fábrica (que puede ser una clase abstracta o una clase no abstracta) determina qué instancia de una clase de producto crear

La clase Calendario es una clase de fábrica abstracta que se utiliza para crear objetos de fecha específicos basados ​​en zonas horarias y regiones. 

El método estático getInstance() se usa para devolver una instancia de una clase de fecha específica, que llama al método createCalendar(time zone, region) para crear una clase de fecha específica, como la clase de fecha japonesa JapaneseImperialCalendar.

Patrón de observador

JDK proporciona la clase abstracta de sujeto y la interfaz de observador de las funciones básicas del modo observador:

La clase abstracta Observable simplemente implementa las funciones básicas del objeto del tema (registro, eliminación, notificación);

Observer es la interfaz del observador y tiene un método update().

¿Hablar de los patrones de diseño usados ​​en Spring?

Spring AOP adopta el método de proxy dinámico JDK para crear dinámicamente objetos de proxy en tiempo de ejecución para lograr mejoras.

Supongo que te gusta

Origin blog.csdn.net/qq_40991313/article/details/130435077
Recomendado
Clasificación