El patrón de diseño Prototype es un patrón creacional que permite copiar objetos existentes sin necesidad de depender de sus clases concretas. En lugar de instanciar objetos nuevos desde cero, este patrón sugiere clonar un objeto "prototipo" previamente definido. Es útil cuando la creación de un objeto es costosa o compleja y se requiere crear múltiples objetos con el mismo estado inicial.
En este artículo, aprenderás qué es el patrón Prototype, cuándo usarlo y cómo implementarlo en PHP.
El patrón Prototype permite crear nuevos objetos copiando un objeto existente, llamado prototipo, sin depender directamente de la clase del objeto. Este patrón se utiliza para:
En PHP, el patrón Prototype se puede implementar utilizando el método __clone()
para duplicar objetos. Vamos a ver un ejemplo donde creamos diferentes tipos de productos clonando un prototipo básico.
Prototype
Primero, definimos una interfaz que cada clase prototipo deberá implementar. Esta interfaz solo contiene un método, clone()
, que se utilizará para clonar objetos.
<?php
interface Prototype {
public function clone(): Prototype;
}
Producto
Ahora creamos una clase concreta llamada Producto
, que implementa la interfaz Prototype
. Esta clase tendrá propiedades que definen un producto, como el nombre, la categoría y el precio.
<?php
class Producto implements Prototype {
private $nombre;
private $categoria;
private $precio;
public function __construct(string $nombre, string $categoria, float $precio) {
$this->nombre = $nombre;
$this->categoria = $categoria;
$this->precio = $precio;
}
// Método para clonar el objeto
public function clone(): Prototype {
return clone $this;
}
public function setNombre(string $nombre) {
$this->nombre = $nombre;
}
public function getNombre(): string {
return $this->nombre;
}
public function setCategoria(string $categoria) {
$this->categoria = $categoria;
}
public function getCategoria(): string {
return $this->categoria;
}
public function setPrecio(float $precio) {
$this->precio = $precio;
}
public function getPrecio(): float {
return $this->precio;
}
public function mostrarDetalles() {
echo "Producto: {$this->nombre}, Categoría: {$this->categoria}, Precio: \${$this->precio}\n";
}
}
Vamos a crear un ejemplo donde clonamos un producto base (prototipo) y creamos nuevos productos modificando ligeramente sus propiedades.
<?php
// Crear un prototipo de producto
$productoBase = new Producto("Producto Base", "General", 100.00);
// Clonar el producto base y modificarlo
$producto1 = $productoBase->clone();
$producto1->setNombre("Producto Clonado 1");
$producto1->setPrecio(150.00);
$producto2 = $productoBase->clone();
$producto2->setNombre("Producto Clonado 2");
$producto2->setCategoria("Electrónica");
$producto2->setPrecio(200.00);
// Mostrar los detalles de los productos clonados
$productoBase->mostrarDetalles();
$producto1->mostrarDetalles();
$producto2->mostrarDetalles();
1. Producto Prototipo: Creamos un objeto Producto
que actúa como prototipo, llamado productoBase
. Este objeto tiene valores iniciales para nombre, categoría y precio.
2. Clonación: Utilizamos el método clone()
para copiar el estado del productoBase
a nuevos objetos (producto1
y producto2
).
3. Modificaciones: A cada producto clonado le modificamos ciertas propiedades, como el nombre, la categoría o el precio.
4. Mostrar Detalles: Cada objeto clonado conserva el estado del prototipo original, pero permite realizar modificaciones puntuales sin alterar el prototipo base.
El resultado al ejecutar este código sería algo como lo siguiente:
Producto: Producto Base, Categoría: General, Precio: $100
Producto: Producto Clonado 1, Categoría: General, Precio: $150
Producto: Producto Clonado 2, Categoría: Electrónica, Precio: $200
__clone()
PHP incluye un método mágico __clone()
que permite especificar qué acciones tomar cuando se clona un objeto. Si tu objeto tiene propiedades que requieren un proceso especial al ser clonadas (como referencias a otros objetos), puedes sobrescribir este método para definir el comportamiento personalizado. Aquí hay un ejemplo simple:
<?php
class Producto implements Prototype {
private $nombre;
private $precio;
public function __clone() {
// Este método se ejecuta cuando el objeto es clonado
echo "Clonando el producto...\n";
}
// Resto del código...
}
El patrón Prototype es una forma eficiente de crear nuevos objetos a partir de un prototipo ya existente, permitiendo clonar objetos sin necesidad de conocer su clase exacta. Es una solución óptima cuando crear objetos desde cero es costoso o complicado, ya que permite reutilizar un objeto base y adaptarlo a nuevas instancias con modificaciones mínimas.
En este artículo hemos visto cómo implementarlo en PHP utilizando la interfaz Prototype
y el método mágico __clone()
, lo que facilita la creación de copias de objetos con diferentes configuraciones. Ahora puedes aplicar este patrón cuando necesites optimizar la creación de objetos en tus aplicaciones.
Jorge García
Fullstack developer