Qualcuno può spiegare la differenza tra modelli di fabbrica e di strategia?
Per me entrambi sembrano uguali oltre a una classe di fabbrica aggiuntiva (che crea un oggetto di prodotto nei modelli di fabbrica)
Qualcuno può spiegare la differenza tra modelli di fabbrica e di strategia?
Per me entrambi sembrano uguali oltre a una classe di fabbrica aggiuntiva (che crea un oggetto di prodotto nei modelli di fabbrica)
Risposte:
Un modello di fabbrica è un modello di creazione. Un modello di strategia è un modello operativo. Detto in altro modo, un modello di fabbrica viene utilizzato per creare oggetti di un tipo specifico. Un modello di strategia viene utilizzato per eseguire un'operazione (o un insieme di operazioni) in un modo particolare. Nell'esempio classico, una fabbrica potrebbe creare diversi tipi di animali: Cane, Gatto, Tigre, mentre un modello di strategia eseguirà azioni particolari, ad esempio Sposta; usando le strategie Run, Walk o Lope.
In effetti i due possono essere usati insieme. Ad esempio, potresti avere una fabbrica che crea i tuoi oggetti business. Può utilizzare strategie diverse in base al mezzo di persistenza. Se i tuoi dati sono archiviati localmente in XML, utilizzerebbe una strategia. Se i dati fossero remoti in un database diverso, ne utilizzerebbe un altro.
Il modello di strategia consente di modificare polimorficamente il comportamento di una classe.
Il modello di fabbrica consente di incapsulare la creazione di oggetti.
Gary ha un ottimo punto. Se stai usando il principio della codifica in astrazioni piuttosto che in "concrezioni", molti schemi iniziano a sembrare variazioni su un tema.
Solo per aggiungere ciò che ha detto tvanfosson, molti dei modelli sembrano uguali per quanto riguarda l'implementazione. Cioè, molto hai creato un'interfaccia in cui forse non ce n'era una prima nel tuo codice, e quindi hai creato un sacco di implementazioni di quell'interfaccia. La differenza sta nel loro scopo e nel modo in cui vengono utilizzati.
Crea solo istanze concrete. Argomenti diversi possono comportare oggetti diversi. Dipende dalla logica ecc.
Incapsula l'algoritmo (passaggi) per eseguire un'azione. Quindi puoi cambiare la strategia e usare un altro algoritmo.
Mentre entrambi sembrano molto simili, lo scopo è piuttosto diverso, uno scopo è quello di creare l'altro è eseguire un'azione.
Così. Se il tuo metodo Factory è fisso, potresti averlo così:
public Command getCommand( int operatingSystem ) {
switch( operatingSystem ) {
case UNIX :
case LINUX : return new UnixCommand();
case WINDOWS : return new WindowsCommand();
case OSX : return new OSXCommand();
}
}
Supponiamo che la tua fabbrica abbia bisogno di una creazione più avanzata o dinamica. È possibile aggiungere al metodo factory una strategia e modificarla senza dover ricompilare, la strategia può cambiare in fase di esecuzione.
Prima di tutto bisogna fare una differenza tra fabbrica semplice e fabbrica astratta. La prima è una semplice fabbrica in cui hai solo una classe che funge da fabbrica per la creazione di oggetti, mentre in quest'ultima ti colleghi a un'interfaccia di fabbrica (che definisce i nomi dei metodi) e quindi chiami le diverse fabbriche che implementano questa interfaccia che si suppone che abbiano implementazioni diverse dello stesso metodo in base ad alcuni criteri. Ad esempio, abbiamo un'interfaccia ButtonCreationFactory, che è implementata da due fabbriche, la prima WindowsButtonCreationFactory (crea pulsanti con l'aspetto e la funzionalità di Windows) e la seconda LinuxButtonCreationFactory (crea pulsanti con l'aspetto e la funzionalità di Linux). Quindi entrambe queste fabbriche hanno lo stesso metodo di creazione con diverse implementazioni (algoritmi).
Ad esempio, se vuoi pulsanti con aspetto Linux:
ButtonCreationFactory myFactory = new LinuxButtonCreationFactory();
Button button1 = myFactory.createButton(...);
o se vuoi i pulsanti di Windows
ButtonCreationFactory myFactory = new WindowsButtonCreationFactory();
Button button1 = myFactory.createButton(...);
Esattamente in questo caso, si traduce in una sorta di modello di strategia, poiché differenzia gli algoritmi per eseguire alcune creazioni. Tuttavia, differisce da esso semanticamente perché è usato per OBJECT CREATION piuttosto che per algoritmi operativi. Quindi, fondamentalmente con la fabbrica astratta hai la creazione di oggetti usando strategie diverse, il che lo rende molto simile al modello di strategia. Tuttavia, AbstractFactory è creativo, mentre il modello di strategia è operativo. Per quanto riguarda l'implementazione, risultano uguali.
Factory (e FactoryMethod restituiti dalla Factory) :
Dai un'occhiata a questo articolo di Wikipedia e all'articolo javarevisited
Modello di strategia:
Esempio:
Puoi configurare la strategia di sconto per un particolare articolo (biglietto AirFare o oggetto ShoppingCart). In questo esempio, offrirai uno sconto del 25% su un articolo nei mesi di luglio - dicembre e Nessuno sconto sull'articolo durante i mesi di giugno - giugno.
Articoli correlati:
Esempio reale del modello di strategia
Modelli di progettazione: metodo Factory vs Factory vs Factory astratto
Per estendere ciò che ha detto Oscar e in riferimento al suo codice:
GetCommand è Factory e le classi UnixCommand, WindowsCommand e OSXCommand sono strategie
Il modello di strategia in termini semplici è più della creazione runtime di comportamenti in cui non si è interessati alla classe di implementazione. Dall'altro, factory aveva la creazione runtime di un'istanza di classe concreta e sta a te usare qualsiasi comportamento (metodo) esposto dall'interfaccia implementata.
Non puoi capire la differenza semplicemente guardando il codice o la categorizzazione. Per comprendere correttamente i modelli GoF, cerca i loro intenti:
Strategia: "Definisci una famiglia di algoritmi, incapsula ciascuno di essi e rendili intercambiabili. La strategia consente all'algoritmo di variare indipendentemente dai client che lo utilizzano."
Metodo di fabbrica: "Definisci un'interfaccia per la creazione di un oggetto, ma lascia che le sottoclassi decidano quale classe creare un'istanza. Il metodo di fabbrica consente a una classe di rinviare l'istanza alle sottoclassi."
Ed ecco una spiegazione elaborata sugli intenti e le differenze tra questi due modelli: differenza tra i metodi di progettazione Metodo di fabbrica e Strategia
Posso divagare con Oscar in quanto il suo esempio di implementazione di Factory è piuttosto stretto e molto chiuso, non c'è da meravigliarsi che la tua scelta sia il modello di strategia. Un'implementazione Factory non dovrebbe dipendere dal numero fisso di classi specifiche che vengono istanziate, ad esempio:
public Command getCommand( int operatingSystem ) {
return commandTable.get(operatingSystem);
}
...
public class WindowsCommand implements Command {
...
static {
CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand());
}
}
Immagino che i criteri più appropriati per scegliere l'uno o l'altro siano principalmente i termini che impieghi per nominare le tue classi e metodi, tenendo conto che tutti dovremmo tendere a programmare su interfacce e non a classi e anche concentrarci sull'obiettivo: miriamo a determinare quale codice verrà eseguito in fase di esecuzione. Detto questo, possiamo raggiungere l'obiettivo utilizzando uno di entrambi i modelli.
La strategia e la fabbrica hanno scopi diversi. Nella strategia hai definito l'approccio, usando questo modello puoi scambiare il comportamento (algoritmi). Venendo in fabbrica ci sono molte varianti in giro. Ma il modello originale di GO4 afferma che la fabbrica lascia la creazione di oggetti alla classe figlio. Qui con la fabbrica stai sostituendo l'istanza completa non il comportamento che ti interessa. Con questo sostituirai il sistema completo non l'algoritmo.
Il modello di fabbrica è un modello di creazione, creato con proprietà (comportamento) specificate. mentre in fase di esecuzione dopo la creazione non è possibile modificarne le proprietà (comportamento). quindi se hai bisogno di proprietà (comportamento) diverse devi eliminare l'oggetto e creare un nuovo oggetto con le proprietà (comportamento) necessarie. che non è gud. mentre in caso di modello di strategia è possibile modificare le proprietà (comportamento) in fase di esecuzione.