Patrones de diseño en Python

Prototype Pattern in Python

Copy an existing, configured object and change a few fields instead of building a new one from scratch.

  • Avanzado
  • 3 min de lectura
  • 1 ejemplo ejecutable
Lo que aprenderás
  • A clone() method built on copy.copy
  • Shallow versus deep copies
  • When cloning beats constructing
published = draft.clone()
original
  • status: Draft
clone
  • status: Published
  • changed independently

Clone, then adjust

Prototype es un patrón de diseño que crea objetos nuevos copiando (clone) un objeto modelo ya configurado, en lugar de construirlo todo de nuevo. Resulta práctico cuando preparar un objeto requiere mucho trabajo y basta con una copia a la que se le cambian algunos atributos.

Puntos clave

  1. clone() returns copy(self): a new object with the same field values.
  2. Change the copy; the original stays the same.
  3. copy() is shallow; use copy.deepcopy when the object holds nested lists or dicts.

¿Cuándo se usa?

  • Resolver problemas recurrentes de diseño de objetos con estructuras probadas.
  • Desacoplar responsabilidades para facilitar la extensión y las pruebas del código.
  • Usar un vocabulario de diseño común al hablar de arquitectura con el equipo.

Código de ejemplo

Ejecutar código →
main.py
from copy import copy


# Prototype: clone an existing configured object.
class Document:
    def __init__(self, status):
        self.status = status

    def clone(self):
        # Return a shallow copy of this configured object.
        return copy(self)


draft = Document("Draft")
published = draft.clone()
published.status = "Published"
print(draft.status)
print(published.status)
Obtén un botón Run para este ejemplo

Resultado de la ejecución

Draft
Published

Explicación del código

El método clone() usa la función copy() para crear una copia independiente del objeto Document. Cuando el estado de la copia pasa a Published, el objeto original sigue en Draft. Cuidado: copy() solo hace una copia superficial (shallow copy). Si el objeto contiene listas o diccionarios, puede que necesites deepcopy().

Cambia los valores y ejecuta el programa en el compilador Python online de CodeUtility sin instalar Python.

Ejercicios de práctica

Prueba a modificar el código siguiendo las ideas de abajo. Cambiar el código y ver el resultado te ayudará a entender la lección mucho mejor que solo leerla.

  1. Sustituye el dominio del ejemplo conservando la estructura del patrón.
  2. Compara el patrón con una implementación más sencilla y explica las ventajas y desventajas.
  3. Escribe pruebas para cada participante antes de añadir otra implementación.
Ejecutar en el compilador de Python →