Este proyecto descompone las preguntas comunes de entrevistas escritas de las principales fábricas, rastrea la fuente hasta los principios de implementación subyacentes de las estructuras de datos y los algoritmos, y sabe cuáles son.
Establezca un sistema de estructura de conocimiento para una búsqueda fácil, dé la bienvenida a más amigos de ideas afines a unirse al proyecto AlgorithmPractice (los problemas y las solicitudes de extracción son bienvenidos).
11. Para obtener más patrones de diseño, vaya directamente a la sección de patrones de diseño en mi github para averiguarlo, gracias por ser tan hábil y ¡venga a prestarme atención!
En algunos escenarios, necesitamos una clase para proporcionar solo un objeto de instanciación, por lo que hacemos que el constructor de la clase sea privado .
¿Cómo obtenemos objetos de esta clase después de privados? Proporcionamos una función getInstance externamente para generar objetos privados.
Entonces, ¿de dónde vino este objeto privado? Si uno define el objeto al comienzo de la clase y luego lo devuelve a través de la función getInstance, lo llamamos modo hombre hambriento (porque tiene demasiada hambre, toda la comida / instancia debe ser nueva para esperarme). Si se define al principio, pero cuando se usa más tarde, nuevo en la función getInstance y return, se convierte en el modo perezoso.
¿Por qué hay un modo de hombre hambriento y un modo de hombre perezoso? La diferencia entre el modo de hombre hambriento y el modo de hombre perezoso es cuando el nuevo objeto es nuevo. Sabemos que el nuevo objeto es un proceso que consume recursos y tiempo. Necesita CPU para programar y asignar memoria, especialmente para objetos grandes, objetos anidados, que a menudo se cargan. Es muy lento, y si lo cargamos cuando realmente lo usamos, ahorrará tiempo.
Entonces, ¿debería usar el modo de hombre perezoso? No, el modo de hombre perezoso no se usa bien, causará problemas de seguridad y aparecerán varios objetos, lo que viola la intención original del modo singleton y además causa problemas de seguridad de subprocesos.
Entonces, ¿cómo se puede utilizar para garantizar la seguridad? Está garantizado por bloqueo sincronizado, pero el bloqueo resultará en una pérdida de rendimiento ¿Qué pasa si esta pérdida se reduce y la operación es segura? Presentamos DCLSingletom, pero ¿DCLSingletom es necesariamente seguro? De hecho, no lo es. Debido al reordenamiento de las instrucciones, existe una cierta posibilidad de que ocurra un error al usar el objeto (el valor del atributo del objeto es nulo).
¿Mejor sugerencia? Utilice la enumeración y la fatiga interna para implementar el modo singleton.
Nota :
Cuando utilice sincronizado, recuerde cooperar con volatile para prohibir el reordenamiento de instrucciones
El surgimiento del modelo de agencia se basa principalmente en la herencia y reescritura de las características del lenguaje de desarrollo.
El modo proxy consiste en agregar algunas operaciones convencionales antes y después de la clase de ejecución real. Algunos métodos públicos que todos usarán. Las aplicaciones comunes, como el manejo unificado de excepciones, el registro unificado, el retorno de error unificado, etc., usan el modo proxy para hacer lo real. La clase de ejecución solo está relacionada con el negocio en sí, sin una consideración excesiva de otras situaciones.
Visualización de código:
La interfaz de proxy, la clase de proxy y la clase de proxy deben implementarla y anular sus métodos.
publicinterfaceProxyInterface{
voidwork();}
Clase de proxy
publicclassProxyimplementsProxyInterface{
ProxyInterface p;publicProxy(ProxyInterface r){
// TODO Auto-generated constructor stub
p = r;}@Overridepublicvoidwork(){
// TODO Auto-generated method stub
System.out.println("i am Proxy, i am help real's work,work begin");
p.work();
System.out.println("i am Proxy, work end");}}
Clase de ejecución real
publicclassRealimplementsProxyInterface{
@Overridepublicvoidwork(){
// TODO Auto-generated method stub
System.out.println("i am real, i am doing work");}}
Lograr efecto
publicclassProxyTest{
@TestpublicvoidtestProxy(){
ProxyInterface r =newReal();
ProxyInterface p =newProxy(r);
p.work();}}
Nota :
En el diseño, la clase de proxy debe considerar más que la clase de proxy.
El modo de observador es equivalente a los ojos en el juego. El observador inserta un ojo en el método de lo observado. Cuando se ejecuta el método de lo observado, el observador recibirá la información e iniciará el método de respuesta.
Por tanto, un modelo de observador completo incluye: el observado y el observador.
El observador debe tener un método específico para cargar al observador y otro método para notificar al observador
Por lo tanto, el observador también debe tener un método de devolución de llamada, que está esperando que el observador active
La esencia del patrón de diseño de plantilla es un marco de algoritmo fijo
La clase principal tiene una plantilla fija, pero los pasos de implementación específicos de la plantilla abierta permiten que las subclases se reescriban
Código
padre
publicabstractclassTemplateDemo{
publicfinalvoidtemplate(){
method1();method2();method3();}publicvoidmethod1(){
System.out.println("father class first stop");}publicvoidmethod2(){
System.out.println("father class second stop");}publicvoidmethod3(){
System.out.println("father class third stop");}}
Subclase
publicclassSubTemplateextendsTemplateDemo{
@Overridepublicvoidmethod1(){
System.out.println("sub class first step");}}