Design patterns: Prototype

Mauto 2 min

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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

TORNA ALLA GUIDA

content_copy Copiato