La tua distinzione non è generalmente corretta. Ad esempio, il modello di fabbrica astratto utilizza il modello di metodo di fabbrica. Nel modello di metodo di fabbrica, le classi che utilizzano e forniscono il metodo factory non devono essere della stessa classe.
Una classe Abstract Factory ha come oggetto esclusivo la creazione di oggetti. Se un'istanza di fabbrica astratta fosse un suo cliente, ciò sarebbe una violazione del principio di Responsabilità Unica.
Di seguito, troverai una discussione sui metodi di fabbrica, il modello di metodo di fabbrica, il modello di fabbrica astratto e confronti tra loro e altri modelli.
Fabbriche o Fabbriche semplici o Metodi di fabbrica
Una factory è una funzione utilizzata per creare una struttura dati. Nei linguaggi OOP, i costruttori sono spesso metodi di fabbrica speciali che non possono essere utilizzati liberamente (ad esempio, spesso non si può esplicitamente return
qualcosa). Incorporando la costruzione in un metodo ordinario, possiamo aggiungere il codice di validazione, pre-elaborazione o ulteriore inizializzazione e possiamo restituire oggetti di tipi diversi a seconda del contesto. Usando metodi di fabbrica, gli utenti sono isolati dalle specifiche della costruzione di oggetti - se vogliamo cambiare il tipo di alcuni oggetti, dobbiamo solo cambiare il codice all'interno della fabbrica, e non tutto il codice che usa quel factory.
Le semplici fabbriche non sono un modello di Go4, ma formano la base di molti modelli come il modello di metodo di fabbrica, il modello di fabbrica astratto e il modello di generatore.
Modello metodo di fabbrica
Nel modello di metodo di fabbrica, abbiamo una classe che contiene un metodo di fabbrica sovrascrivibile. Le sottoclassi sono incoraggiate a sovrascrivere questo metodo per modificare il tipo dell'oggetto restituito. Pseudocodice:
interface Product { … }
class DefaultProduct implements Product { … }
class SpiffyProduct implements Product { … }
class Creator {
virtual Product create() { return new DefaultProduct() }
}
class OtherCreator extends Creator {
override Product create() { return new SpiffyProduct() }
}
// client code:
Creator c = ...;
Product = c.create();
Tieni presente che Creator::create
è un metodo factory / factory semplice. Tuttavia, la proprietà di identificazione del modello di metodo di fabbrica è l'utilizzo dell'ereditarietà per modificare il metodo di fabbrica.
Il vantaggio del modello di metodo di fabbrica è che per cambiare il metodo di fabbrica utilizzato nel codice cliente, dobbiamo solo cambiare la linea in cui viene ottenuto / creato Creator c
. Questa flessibilità consente di utilizzare il modello del metodo di fabbrica per le semplici attività di iniezione delle dipendenze.
Variazioni
Se utilizziamo il metodo del metodo di fabbrica e il client si trova nella stessa classe del metodo di fabbrica, questo può anche essere descritto come il modello di strategia applicato come modello di creazione.
La classe radice Creator
non deve essere istanziabile o fornire un prodotto predefinito. Invece, potrebbe essere astratto o un'interfaccia.
Un oggetto può ragionevolmente implementare il modello di metodo di fabbrica più volte per diversi Product
s. Se la creazione dell'oggetto è lo scopo principale del creatore e i diversi prodotti sono correlati, questo è probabilmente meglio descritto come il modello astratto di fabbrica.
Generalmente, il Pattern Metodo di Fabbrica viene usato come aiuto per raggiungere la preoccupazione principale di quell'oggetto (per esempio quando usato in combinazione con il Modello di Strategia). Se il metodo factory è l'unico metodo di una classe che implementa il pattern del metodo di fabbrica, questo può anche essere visto come un esempio del pattern di comando.
Modello di fabbrica astratto
Il modello di fabbrica astratto usa il modello di metodo di fabbrica per creare una tavolozza di oggetti correlati. Oppure: l'istanza di fabbrica astratta è quella tavolozza.
Mentre il pattern del metodo di fabbrica viene spesso usato come helper per fare qualcos'altro, la preoccupazione principale di un oggetto factory in Abstract Factory Pattern è sempre la creazione dell'oggetto. Come tale, il client dovrebbe sempre essere una classe diversa, anche se una fabbrica astratta potrebbe anche usarsi da sola, ad es. per assemblare un oggetto composito.