Qual è la differenza tra i modelli Factory e Strategy?


Risposte:


227

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.


1
`Un modello di strategia viene utilizzato per eseguire un'operazione (o un insieme di operazioni) in un modo particolare` Significa operazioni sugli oggetti?
OPV

32

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.


25

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.


13
  • 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.

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.


Non penso che tu stia facendo un punto giusto qui. Prima di tutto, uno dei motivi di questi schemi è di evitare i condizionali a favore del polimorfismo. Prima di tutto bisogna fare una differenza tra factory semplice e abstract factory.d Il primo è un semplice factory in cui hai solo una classe che funge da factory per la creazione di oggetti, mentre in quest'ultimo ti colleghi a un'interfaccia e poi chiami le diverse fabbriche che implementano questa interfaccia che dovrebbero avere implementazioni diverse dello stesso metodo basato su alcuni criteri. (continua)
interboy,

4
Esattamente in questo caso, si traduce in una sorta di modello di strategia, ma differisce da esso semanticamente perché viene utilizzato per CREAZIONE DI OGGETTI piuttosto che per operazioni. Quindi, fondamentalmente, hai la creazione di oggetti usando strategie diverse.
Interboy,

2
@OscarRyz Puoi aggiornare la tua risposta con un programma che descriva entrambi
Prakash Pandey,

11

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.


10

Factory (e FactoryMethod restituiti dalla Factory) :

  1. Modello creazionale
  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 all'articolo javarevisited

Modello 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 passare da una famiglia di algoritmi a un'altra
  5. Cambia il comportamento dell'oggetto in fase di esecuzione

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


3

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

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


3

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.


2

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


1

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.


1

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.


0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.