Domanda

Qualcuno può spiegare la differenza tra i modelli di fabbrica e quelli di strategia?

Per me entrambi sembrano uguali oltre a una classe di fabbrica aggiuntiva (che crea un oggetto di prodotto nei modelli di fabbrica)

È stato utile?

Soluzione

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 utilizzerebbero un altro.

Altri suggerimenti

Il modello di strategia ti consente di cambiare polimorficamente il comportamento di una classe.

Il modello di fabbrica consente di incapsulare la creazione di oggetti.

Gary è un ottimo punto. Se stai usando il principio della codifica per le astrazioni piuttosto che "concrezioni" quindi molti dei modelli 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 prima nel tuo codice, e quindi crea un gruppo di implementazioni di quell'interfaccia. La differenza sta nel loro scopo e nel modo in cui vengono utilizzati.

  • Il modello Factory (metodo).

Crea solo istanze concrete. Argomenti diversi possono comportare oggetti diversi. Dipende dalla logica ecc.

  • Il modello di strategia.

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.

. Se il tuo metodo Factory è risolto, 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();
       }
  }

Ma supponiamo che la tua fabbrica abbia bisogno di una creazione più avanzata o dinamica. Puoi aggiungere al metodo factory una strategia e modificarla senza dover ricompilare, la strategia potrebbe cambiare in fase di esecuzione.

Innanzitutto 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 aspetto e funzionalità Windows) e la seconda LinuxButtonCreationFactory (crea pulsanti con aspetto Linux). Quindi entrambe queste fabbriche hanno lo stesso metodo di creazione con diverse implementazioni (algoritmi). È possibile fare riferimento a questo in runtime in base al metodo digitato del pulsante desiderato.

Ad esempio se si desidera 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é viene utilizzato 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 da Factory) :

  1. Schema di creazione
  2. Basato sull'eredità
  3. Factory restituisce un metodo Factory (interfaccia) che a sua volta restituisce Concrete Object
  4. È possibile sostituire nuovi oggetti in calcestruzzo con l'interfaccia e il client (chiamante) non deve essere a conoscenza di tutte le implementazioni concrete
  5. Il client accede sempre solo all'interfaccia e puoi nascondere i dettagli di creazione dell'oggetto nel metodo Factory

Dai un'occhiata a questo articolo di Wikipedia e articolo javarevisited

Schema di strategia:

  1. È un modello comportamentale
  2. Si basa sulla delega
  3. Cambia l'intestino dell'oggetto modificando il comportamento del metodo
  4. È usato per alternare tra la famiglia di algoritmi
  5. Cambia il comportamento dell'oggetto in fase di esecuzione

Esempio:

È possibile 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 a luglio - dicembre e Nessuno sconto sull'articolo a Jaunary - giugno.

Articoli correlati:

Esempio reale del modello di strategia

Pattern di progettazione: metodo Factory vs Factory vs Abstract Factory

Il modello di strategia in termini semplici è più della creazione runtime di comportamenti che non riguardano la classe di implementazione. Dall'altro, factory aveva la creazione di runtime di istanze di classe concrete e sta a te usare qualsiasi comportamento (metodo) esposto dall'interfaccia implementata.

Per estendere ciò che ha detto Oscar e in riferimento al suo codice:

getCommand è Factory e le classi UnixCommand, WindowsCommand e OSXCommand sono strategie

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 strategico. Un'implementazione di 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 sulle interfacce e non sulle classi e concentrarci anche sull'obiettivo: noi mirare a determinare quale codice verrà eseguito in fase di esecuzione. Detto questo, possiamo raggiungere l'obiettivo utilizzando uno di entrambi i modelli.

Strategia e 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.

Non puoi capire la differenza semplicemente guardando il codice o la categorizzazione. Per cogliere correttamente i modelli GoF, cerca i loro intenti:

Strategia: " Definisci una famiglia di algoritmi, incapsula ciascuno e rendili intercambiabili. La strategia consente all'algoritmo di variare indipendentemente dai client che lo utilizzano. & Quot;

Metodo di fabbrica: " Definisce un'interfaccia per la creazione di un oggetto, ma lascia che le sottoclassi decidano quale classe creare un'istanza. Il metodo Factory consente a una classe di rinviare l'istanza alle sottoclassi. & Quot;

Ed ecco una spiegazione elaborata degli intenti e delle differenze tra questi due schemi: Differenza tra i metodi di progettazione Metodo di fabbrica e Strategia

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 puoi modificare le proprietà (comportamento) in fase di esecuzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top