Design patterns: Prototype
Il pattern Prototype permette di creare nuovi oggetti clonando un’istanza esistente. Questo è utile quando la creazione di un nuovo oggetto richiede risorse significative e possiamo ottenere nuove istanze clonando quelle esistenti.
Caratteristiche del pattern prototype
- Creazione di Oggetti tramite clonazione: Il Prototype Pattern consente di creare nuovi oggetti copiando (clonando) un oggetto esistente, anziché istanziarlo tramite un costruttore. Questo è particolarmente utile per oggetti complessi.
- Immutabilità dei Prototipi: Gli oggetti prototipo possono essere utilizzati come basi per la creazione di nuovi oggetti. I nuovi oggetti creati tramite clonazione possono essere modificati senza alterare l’oggetto prototipo originale.
- Indipendenza dalla Classe concreta: Il pattern non richiede che il codice client conosca la classe concreta degli oggetti che sta creando. Può interagire con gli oggetti attraverso un’interfaccia comune.
- Semplificazione della Creazione di Oggetti complessi: Quando un oggetto è difficile o costoso da creare, il Prototype Pattern permette di definire un oggetto “modello” che può essere clonato e personalizzato.
- Efficienza: Clonare un oggetto può essere più efficiente rispetto alla creazione di un nuovo oggetto, specialmente se il processo di costruzione è complesso e richiede molte risorse.
- Supporto per la Variazione Dinamica: È facile cambiare la configurazione di un oggetto copiato senza influenzare il prototipo originale, consentendo flessibilità nella gestione degli oggetti durante l’esecuzione.
- Minor dipendenza da Costruttori: Riduce la necessità di utilizzare diversi costruttori per vari oggetti, semplificando il codice e migliorando la manutenibilità.
Esempio in PHP:
Immaginiamo di avere un sistema in cui possiamo creare diversi tipi di animali clonandoli.
// Interfaccia Prototype
interface AnimalPrototype {
public function __clone();
public function getType();
}
// Classe Concreta per Pecora
class Sheep implements AnimalPrototype {
private $type = "Pecora";
public function getType() {
return $this->type;
}
public function __clone() {
// Possiamo aggiungere logica di clonazione qui se necessario
}
}
// Classe Concreta per Mucca
class Cow implements AnimalPrototype {
private $type = "Mucca";
public function getType() {
return $this->type;
}
public function __clone() {
// Possiamo aggiungere logica di clonazione qui se necessario
}
}
// Utilizzo
$sheepPrototype = new Sheep();
$firstSheepClone = clone $sheepPrototype;
$secondSheepClone = clone $sheepPrototype;
$cowPrototype = new Cow();
$firstCowClone = clone $cowPrototype;
echo "Clonata: " . $firstSheepClone->getType() . "\n"; // Clonata: Pecora
echo "Clonata: " . $secondSheepClone->getType() . "\n"; // Clonata: Pecora
echo "Clonata: " . $firstCowClone->getType() . "\n"; // Clonata: Mucca