Prototype Pattern in Python
Copy an existing, configured object and change a few fields instead of building a new one from scratch.
- A clone() method built on copy.copy
- Shallow versus deep copies
- When cloning beats constructing
- status: Draft
- 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
clone()returnscopy(self): a new object with the same field values.- Change the copy; the original stays the same.
copy()is shallow; usecopy.deepcopywhen 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
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)
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.
- Sustituye el dominio del ejemplo conservando la estructura del patrón.
- Compara el patrón con una implementación más sencilla y explica las ventajas y desventajas.
- Escribe pruebas para cada participante antes de añadir otra implementación.