Patrón de creación: prototipo

Dec 04 2022
Este artículo analiza cómo se pueden crear nuevos objetos a partir de objetos existentes utilizando el patrón prototipo. ¿Qué es? El patrón de prototipo es un patrón de creación en el que se crean nuevos objetos copiando un objeto existente.

Este artículo analiza cómo se pueden crear nuevos objetos a partir de objetos existentes utilizando el patrón prototipo.

¿Qué es?

El patrón de prototipo es un patrón de creación en el que se crean nuevos objetos copiando un objeto existente. El objeto cuyas copias se hacen se llama prototipo . Para comprender mejor los objetos, puede considerar que el objeto prototipo es la "semilla" a partir de la cual se crean todos los demás objetos. Entonces, podría preguntarse por qué no crearía nuevos objetos cuando sea necesario en lugar de clonar los existentes. Las motivaciones para los objetos prototipo son las siguientes:

  • A veces, crear un nuevo objeto es más costoso que copiar uno existente.
  • Imagínese si no pudiera acceder estáticamente al constructor de una clase y el entorno de tiempo de ejecución tuviera que crear una instancia de cada clase cargada dinámicamente. En cambio, la aplicación podría solicitar objetos de un administrador de prototipos que devolvería clones de prototipos.
  • Puede reducir significativamente la cantidad de clases en un sistema variando los valores de los objetos clonados de una instancia prototípica.

Diagrama de clase

El diagrama de clases contiene las siguientes entidades:

  • Prototipo
  • prototipo de hormigón
  • Cliente

Tomemos el ejemplo de un avión para comprender mejor el patrón del prototipo. Primero, creamos una clase para representar el F-16. Pero sabemos que el F-16 tiene algunas variantes. Entonces, para representar cada una de las variantes del F16, podemos crear subclases. Pero luego terminaremos con varias subclases en nuestro sistema. Además, supongamos que las variantes del F16 se diferencian únicamente por sus tipos de motor. Entonces, una posibilidad sería retener una sola clase F16 pero agregar un método para configurar el tipo de motor de la aeronave. De esa forma, podemos crear un solo objeto F16 como prototipo y clonarlo para varias versiones de aviones.

Primero, creamos una interfaz.

La clase F-16 implementa su interfaz así:

El cliente puede usar el patrón así:

Tenga en cuenta que el método de clonación de la interfaz IAircraftPrototype devuelve un tipo abstracto . Los clientes no saben qué diferentes implementaciones de la misma interfaz crearán subclases concretas. Por ejemplo, se puede pasar la clase Boeing747 , produciendo copias de cualquier prototipo que se pase (un F16 o un Boeing747). El patrón prototipo ayuda a eliminar las subclases, ya que el comportamiento de los objetos prototipo se puede variar componiéndolos con subpartes.

Copia superficial vs. profunda

El patrón prototipo requiere la clase o interfaz prototipo para implementar un método clone() . La clonación puede ser superficial o profunda. Por ejemplo, si nuestra clase F-16 tiene un objeto miembro de tipo F16Engine , en una copia superficial, el objeto clonado apuntaría al mismo objeto F16Engine que el prototipo. Pero en una copia profunda, el objeto clonado obtendría su copia de su objeto de motor y cualquier objeto anidado dentro de él. No se compartirá ningún campo (anidado o no) entre el prototipo y su clon.

Carga dinámica

El patrón prototipo puede facilitar la carga dinámica de clases. La carga dinámica le permite cargar una clase en tiempo de ejecución en lugar de tener la clase disponible en tiempo de compilación. En un lenguaje que admita la carga dinámica, un marco creará una instancia de la clase cargada y la registrará en una entidad de gestión. Luego, en tiempo de ejecución, su aplicación puede pedirle a este administrador que le proporcione un objeto que pertenezca a esa clase.

Otros ejemplos

En el lenguaje de programación Java, la clase Object tiene un método de clonación. La clase implementa la interfaz java.lang.Cloneable .

Advertencias

La implementación del método de clonación puede ser difícil debido a las referencias circulares.

Otros artículos de la serie Patrón de creación