También conocido como Clon, el patrón de diseño de software Prototipo es un patrón de diseño creacional que te permite copiar objetos existentes sin hacer que tu código dependa de sus clases.

En algunas situaciones, deseas crear una copia exacta de un objeto existente. Por ejemplo un avión. Puedes crear un nuevo objeto de la misma clase Plane, después revisas todos los campos del objeto original y copias sus valores en el nuevo objeto. ¿Cierto?

El problema es que no todos los objetos se pueden copiar porque algunos de los campos del objeto pueden ser privados y no visibles desde fuera del propio objeto. Y es posible que tu objeto (avión) copiado no levante vuelo.

Además, dado que debes conocer la clase del objeto para crear un duplicado, tu código se vuelve dependiente de esa clase.

Por eso, el patrón prototipo delega el proceso de clonación a los objetos reales que se están clonando. Lo hace declarando una interfaz común para todos los objetos que admiten clonación. La interfaz, que contiene un único método de clonación, te permite clonar sin acoplar tu código a la clase.

El método de clonación, muy similar en todas las clases, crea un objeto de la clase actual y transfiere todos los valores de campo del objeto antiguo al nuevo. También copia campos privados.

Un objeto que admite la clonación se denomina prototipo.

¿Cuándo usar el patrón Prototipo (Prototype)?

Deberías usar el patrón Prototipo cuando tu código no debe depender de las clases concretas de objetos que necesitas copiar. Por ejemplo cuando tu código funciona con objetos que te pasan desde un código de terceros a través de alguna interfaz. No conoces las clases concretas de estos objetos y no puedes depender de ellas.

Otro caso en el que deberías utilizar este patrón es cuando quieres reducir el número de subclases que solo difieren en la forma en que se inicializan sus objetos. Este patrón te permite usar un conjunto de objetos preconstruidos configurados de varias maneras como prototipos.

Pros y contras del patrón prototipo

Los siguientes son algunos de los “pros y cons” de este patrón:

Pros

Contras

  • Puedes clonar objetos sin acoplarlos  a tus clases concretas

  • Puedes deshacerte del código de inicialización repetido (clonas prototipos preconstruidos)

  • Obtienes una alternativa a la herencia (ajustes preestablecidos de configuración para objetos complejos)

  • La clonación de objetos complejos que tienen referencias circulares puede ser muy complicada

“Show me the code”

Para que tengas una idea de cómo funciona el patrón prototipo, puedes echar un vistazo al ejemplo en PHP de refactoring.guru.

En el ejemplo del “mundo real” verás cómo clonar un objeto de página (Page) complejo utilizando el patrón prototipo. Los campos privados de la clase Page se transfieren al objeto clonado.

¿Utilizas el patrón Prototype en tus proyectos? ¿Qué tal la experiencia? ¡Coméntalo abajo!

Fuente:

Compartir es construir