Modello Creativo: Prototipo

Dec 04 2022
Questo articolo illustra come creare nuovi oggetti da oggetti esistenti utilizzando il modello prototipo. Che cos'è? Il modello prototipo è un modello creazionale in cui vengono creati nuovi oggetti copiando un oggetto esistente.

Questo articolo illustra come creare nuovi oggetti da oggetti esistenti utilizzando il modello prototipo.

Che cos'è?

Il modello prototipo è un modello creazionale in cui vengono creati nuovi oggetti copiando un oggetto esistente. L'oggetto di cui vengono fatte le copie è chiamato prototipo . Per comprendere meglio gli oggetti, puoi considerare l'oggetto prototipo come il "seme" da cui vengono creati tutti gli altri oggetti. Quindi potresti chiederti perché non dovresti creare nuovi oggetti quando necessario invece di clonare quelli esistenti. Le motivazioni per gli oggetti prototipo sono le seguenti:

  • A volte creare un nuovo oggetto è più costoso che copiarne uno esistente.
  • Immagina se non potessi accedere staticamente al costruttore di una classe e l'ambiente di runtime dovesse creare un'istanza di ogni classe caricata dinamicamente. Invece, l'applicazione potrebbe richiedere oggetti da un gestore di prototipi che restituirebbe cloni di prototipi.
  • È possibile ridurre significativamente il numero di classi in un sistema variando i valori degli oggetti clonati da un'istanza prototipica.

Diagramma di classe

Il diagramma di classe contiene le seguenti entità:

  • Prototipo
  • Prototipo in calcestruzzo
  • Cliente

Prendiamo l'esempio di un aereo per capire meglio lo schema del prototipo. Innanzitutto, abbiamo creato una classe per rappresentare l'F-16. Ma sappiamo che l'F-16 ha alcune varianti. Quindi, per rappresentare ciascuna delle varianti dell'F16, possiamo creare delle sottoclassi. Ma poi ci ritroveremo con diverse sottoclassi nel nostro sistema. Supponiamo inoltre che le varianti F16 differiscano solo per la motorizzazione. Quindi una possibilità sarebbe quella di mantenere un'unica classe F16 ma aggiungere un metodo per impostare il tipo di motore dell'aeromobile. In questo modo, possiamo creare un singolo oggetto F16 come prototipo e clonarlo per varie versioni di aerei.

Innanzitutto, creiamo un'interfaccia.

La classe F-16 implementa la sua interfaccia in questo modo:

Il client può utilizzare il modello in questo modo:

Si noti che il metodo clone dell'interfaccia IAircraftPrototype restituisce un tipo astratto . I clienti non sanno quali diverse implementazioni della stessa interfaccia creeranno sottoclassi concrete. Ad esempio, la classe Boeing747 può essere passata, producendo copie di qualunque prototipo sia passato (un F16 o un Boeing747). Il modello prototipo aiuta a eliminare le sottoclassi, poiché il comportamento degli oggetti prototipo può essere variato componendoli con sottoparti.

Shallow vs Deep Copy

Il modello prototipo richiede che la classe prototipo o l'interfaccia implementino un metodo clone() . La clonazione può essere superficiale o profonda. Ad esempio, se la nostra classe F-16 ha un oggetto membro di tipo F16Engine , in una copia superficiale, l'oggetto clonato punterebbe allo stesso oggetto F16Engine del prototipo. Ma in una copia completa, l'oggetto clonato otterrebbe la sua copia del suo oggetto motore e tutti gli oggetti nidificati al suo interno. Non ci sarà alcuna condivisione di alcun campo, nidificato o altro, tra il prototipo e il suo clone.

Caricamento dinamico

Il modello prototipo può semplificare il caricamento dinamico delle classi. Il caricamento dinamico consente di caricare una classe in fase di esecuzione invece di avere la classe disponibile in fase di compilazione. In un linguaggio che supporta il caricamento dinamico, un framework creerà un'istanza della classe caricata e la registrerà in un'entità di gestione. Quindi, in fase di esecuzione, la tua applicazione può chiedere a questo gestore di darti un oggetto che appartiene a quella classe.

Altri esempi

Nel linguaggio di programmazione Java, la classe Object ha un metodo clone. La classe implementa l'interfaccia java.lang.Cloneable .

Avvertenze

L'implementazione del metodo clone può essere difficile a causa dei riferimenti circolari.

Altri articoli nella serie Creational Pattern