Modo de prototipo del modo de diseño 7

Si encuentra la necesidad de crear una gran cantidad de objetos durante el desarrollo, puede usar constructores tradicionales para crear objetos. Pero esto es demasiado problemático para el desarrollo ¿Existe una forma eficiente de generar objetos?

Por supuesto que hay, el modo de prototipo puede resolver los problemas anteriores.

Que es el modo prototipo

"

Especifique los tipos de objetos a crear usando una instancia prototípica y cree nuevos objetos copiando este prototipo (especifique los tipos de objetos para crear usando una instancia prototipo y cree nuevos objetos copiando estos prototipos).

"

Si se ha creado un objeto, podemos crear un nuevo objeto copiando. Este es el modo de prototipo, usando el modo de prototipo para crear objetos, no necesitamos conocer los detalles de creación. De hecho, este método es muy eficaz.

Echemos un vistazo: todos han instalado JDK en Windows, debemos hacer clic en muchos de los siguientes pasos al instalar. Es posible que también deba seleccionar la ruta de instalación y seleccionar el módulo instalado. Si instalamos JDK en Linux, solo necesitamos copiar el archivo de instalación de JDK a Linux, descomprimirlo y usarlo. Verá, instalar archivos en Windows es mucho más complicado que instalar en Linux.

La clave del modo de prototipo es la replicación. El propósito de la replicación es simplificar el proceso de creación de objetos y mejorar la eficiencia.

La estructura del patrón prototipo.

Contiene principalmente varios elementos:

"
  • Clase de prototipo abstracto: define la interfaz que se debe implementar

  • Clase de prototipo concreto: el clone()método de implementación de la clase de prototipo abstracto

  • Clase de acceso: clone()objeto copiado mediante el método de llamada

"

Modo de prototipo

Tenga en cuenta que el clone()método aquí es copia superficial.

Los resultados son los siguientes:

Revisé Wikipedia sobre copia superficial y copia profunda. Si está interesado, puede ir al texto original:

"

https://en.wikipedia.org/wiki/Object_copying

"

Aquí traduje:

Copia superficial

"

Una forma de copiar objetos es la copia superficial. En este caso, cree un nuevo objeto B y copie el valor de campo de A en B. Esto también se denomina copia campo por campo, copia campo por campo o copia campo. Si el valor del campo es una referencia a un objeto ( Como dirección de memoria), copiará la referencia, de modo que haga referencia al mismo objeto que A. Si el valor del campo es un tipo primitivo, copiará el valor del tipo primitivo. En un lenguaje sin tipos primitivos (en este lenguaje, todo es un objeto), todos los campos de la B copiada se refieren al mismo objeto que el campo A original, por lo que el objeto referenciado es compartido, así que si Uno de los objetos se modifica (de A o B), luego el cambio se puede ver en el otro objeto. Las copias superficiales son sencillas y, por lo general, baratas, porque normalmente se pueden conseguir simplemente copiando bits con precisión.

"

Permítanme resumir que en una copia superficial, si el atributo en el objeto original es un tipo básico, el valor se copiará al nuevo objeto, y si es un tipo de referencia, se usará la misma referencia.

Copia profunda

"

El otro método es la copia profunda, lo que significa que el campo está desreferenciado: en lugar de una referencia al objeto que se está copiando, se crea un nuevo objeto de copia para cualquier objeto referenciado y las referencias a estos objetos se colocan en B. El resultado es diferente al de una copia superficial, porque el objeto al que hace referencia la copia B es diferente del objeto al que hace referencia A y es independiente. Debido a la necesidad de crear objetos adicionales, el costo de la copia profunda es mayor y, dado que las referencias pueden formar un gráfico complejo, la copia profunda puede ser más complicada.

La copia profunda se refiere al proceso en el que el proceso de copia ocurre de forma recursiva. Significa construir primero un nuevo objeto de colección y luego llenarlo de forma recursiva con copias de los objetos secundarios que se encuentran en el objeto original. En el caso de la copia profunda, una copia de un objeto se copia a otros objetos. Esto significa que cualquier cambio en la copia del objeto no se reflejará en el objeto original. En Python, esta función se realiza a través de la deepcopy() función " ".

"

En general, una copia profunda crea una nueva referencia.

Visualización de código

RealizeType

Prueba de prototipo

Resultados de la prueba:

具体原型创建成功!
具体原型复制成功!
obj1==obj2?false

La realización del modo prototipo es realmente muy simple, siempre que clone()se llame al método , la propiedad se puede copiar.

Pensando en el modelo prototipo

El uso del modo prototipo tiene un rendimiento excelente. En el modo prototipo, los objetos no son directamente nuevos. Al copiar objetos existentes en la memoria, si necesita generar una gran cantidad de objetos en el bucle, puede utilizar el modo prototipo.

De hecho, el modo prototipo se usa en muchos lugares.

En Spring, el patrón de prototipo se usa ampliamente, por ejemplo  scope='prototype', JSON.parseObject() etc.son aplicaciones específicas del patrón de prototipo.

Creo que debe haberlo utilizado BeanUtils.copyPropertiescomo copia física. De hecho, esta copia también es una copia superficial.

A lo que debe prestar atención acerca de la copia superficial

Sabemos que las copias superficiales compartirán la misma dirección. Si el valor del atributo de un objeto (tipo de referencia) cambia, el valor de otro objeto también cambiará en consecuencia. Los dos objetos comparten una variable privada. Puedes cambiarla y todos pueden cambiarla. Esta es una forma muy insegura y rara vez se usa en proyectos reales. (Por supuesto, esto también es una especie de entorno de "crisis". Salvavidas)

Usamos código para ilustrar el problema:

Problema de copia superficial

Creamos una clase para copiarCitation

Código de prueba

Echemos un vistazo a los resultados directamente:

"

Si obj2el Membercontenido de en cambia, ¿ obj1cambiará el Membercontenido de?

"

La respuesta a esta pregunta cambiará .

Así que clone()preste atención a este problema cuando utilice objetos de copia.

 

Recomendado en el pasado

Escanee el código QR para ser más emocionante. O busque Lvshen_9 en WeChat , puede responder para obtener información en segundo plano

1.回复"java" 获取java电子书;

2.回复"python"获取python电子书;

3.回复"算法"获取算法电子书;

4.回复"大数据"获取大数据电子书;

5.回复"spring"获取SpringBoot的学习视频。

6.回复"面试"获取一线大厂面试资料

7.回复"进阶之路"获取Java进阶之路的思维导图

8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

9.回复"总结"获取Java后端面试经验总结PDF版

10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)

Otro: haga clic en [ Mis beneficios ] para tener más sorpresas.

Supongo que te gusta

Origin blog.csdn.net/wujialv/article/details/109043823
Recomendado
Clasificación