"Il metodo di fabbrica è una specializzazione del metodo dei modelli". Come?

7

Somiglianze e differenze tra i due:

Metodo modello

  • si basa sull'ereditarietà.
  • Definisce i passaggi di un algoritmo e lascia il compito di implementarli in sottoclassi.

Metodo di fabbrica

  • si basa sull'ereditarietà.
  • Una superclasse definisce un'interfaccia per creare un oggetto. Le sottoclassi decidono quale classe concreta istanziare.

I due affiancati:

Nonsonosicurodicosasignifichilafrase"Metodo di fabbrica è una specializzazione del Metodo modello" (è nella Libro di Head First Design Patterns ). In Beverage abbiamo il metodo prepare che è final e definisce una serie di passaggi. In PizzaStore abbiamo un metodo che è abstract e le sottoclassi lo ridefiniscono. In che modo quest'ultima è una specializzazione della prima?

    
posta Maria Ines Parnisari 12.01.2017 - 23:38
fonte

3 risposte

5

In Beverage abbiamo il metodo ("template") prepare che chiama alcuni metodi astratti come boilWater , brew ecc. che sono implementati nelle sottoclassi. Non è essenzialmente per il modello avere il metodo template posizionato nella classe base, potrebbe essere in qualsiasi altro posto, supponendo che i metodi astratti siano pubblici. Ma è essenzialmente il fatto che ci sono i metodi astratti che devono essere cancellati e colmeranno le lacune nel "template dell'algoritmo".

Il metodo factory riguarda anche una classe in cui i metodi astratti vengono sovrascritti, un punto centrale è che chi chiama quel metodo non ha bisogno di conoscere il tipo esatto dell'oggetto creato. Nota che in PizzaStore , il metodo astratto createPizza deve essere chiamato da qualche parte - diciamo un metodo createLotsOfPizza .

Ciò rende quest'ultimo un metodo modello, in cui i passaggi specifici dell '"algoritmo per creare pizze" sono le lacune da colmare. Ora è probabilmente solo un uso impreciso delle parole dicendo "lo schema del metodo di fabbrica" è un caso speciale del modello "metodo modello". Soprattutto i "metodi factory" non sono "metodi template", tuttavia potrebbero essere chiamati da un metodo template. Quindi per essere più precisi, potremmo dire

"the factory method pattern is typically used in conjunction with a special case of the template method pattern"

e immagino che sia quello che gli autori di quel libro volevano esprimere.

    
risposta data 12.01.2017 - 23:50
fonte
0

Penso che "Metodo di fabbrica è una specializzazione del metodo di modello" è una mis-caratterizzazione. Credo che sarebbe più accurato dire che il pattern Method Template è semplicemente una variazione sul pattern del metodo Factory.

Inoltre, sostengo che il modello di Metodo Template non è affatto un modello (nel senso della Banda dei Quattro), dal momento che sorge spontaneamente attraverso l'ereditarietà e l'override del metodo. Potete vedere che, nel diagramma sopra per il Pattern Template, le classi discendenti si limitano a sovrascrivere i metodi nella classe base con il loro stesso comportamento.

Nel complesso, i modelli software (della varietà Gang of Four) sono in realtà solo soluzioni alternative per le carenze nei linguaggi di programmazione e il modello di template riafferma solo i linguaggi orientati agli oggetti che sono già in grado nativamente.

    
risposta data 12.01.2017 - 23:50
fonte
0

Direi che Head First è semplicemente sbagliato in questa caratterizzazione.

Wikipedia definisce il metodo del modello come:

In software engineering, the template method pattern is a behavioral design pattern that defines the program skeleton of an algorithm in an operation, deferring some steps to subclasses.

(Si riferisce a GoF per questo.)

E il metodo di fabbrica è definito come:

In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created.

Non c'è sovrapposizione tra i due, tranne che in C ++, l'ereditarietà è una parte fondamentale di entrambi. Tuttavia, in linguaggi che fanno una distinzione tra ereditarietà dell'implementazione ( extends in Java) e implementazione dell'interfaccia ( implements in Java), anche questa comunanza non esiste, poiché l'implementazione dell'interfaccia è sufficiente per il metodo factory, ma non per il metodo template . E in C ++, l'ereditarietà di implementazione pura (senza l'ereditarietà dell'interfaccia, ovvero l'ereditarietà privata o CRTP) può essere utilizzata per il primo, ma non per il secondo.

E a parte questo? Uno è un modello di progettazione comportamentale, l'altro un modello creazionale. Uno descrive uno schema di un'operazione, con alcune parti chiave lasciate fuori da sottoclassi specializzate; l'altro specifica un contratto molto semplice, lasciando l'intera implementazione alle istanze concrete. Sono completamente distinti.

Secondo me, la frase citata è semplicemente sbagliata. O è un errore eclatante nel libro, o (meno probabile) è fuori dal contesto e dovrebbe essere interpretato in modo diverso.

    
risposta data 13.01.2017 - 11:00
fonte