2010-06-17 14 views
5

Lavorando attraverso il libro Head First Design Patterns.Quando il metodo di fabbrica è migliore della semplice fabbrica e viceversa?

Credo di capire la semplice fabbrica e il metodo factory, ma sto avendo difficoltà a vedere quale metodo vantaggi fabbrica porta oltre semplice fabbrica.

Se un oggetto Un utilizza una semplice fabbrica per creare i suoi oggetti B, quindi i clienti possono creare in questo modo:

A a = new A(new BFactory()); 

mentre se un oggetto usa un metodo di fabbrica, un client può creare in questo modo:

A a = new ConcreteA(); // ConcreteA contains a method for instantiating 
         // the same Bs that the BFactory above creates, with 
         // the method hardwired into the subclass of A, ConcreteA. 

Quindi, nel caso del semplice fabbrica, i clienti comporre una con una fabbrica B, mentre con il metodo factory, il cliente sceglie la sottoclasse appropriata per i tipi di B che vuole.

Ci realmente non sembra essere molto da scegliere tra di loro. O devi scegliere con quale BFactory vuoi comporre A, oppure devi scegliere la sottoclasse giusta di A per darti i Bs.

In quali circostanze è uno migliore rispetto agli altri?

Grazie a tutti!

Modifica: aggiungere un po 'alla confusione IMO è la spiegazione fornita nella narrazione di Head First in cui passano dal semplice metodo factory a factory dicendo (p.119) "i franchising stavano usando la tua [semplice] factory per creare pizze , ma comincia a impiegare le proprie procedure di produzione propria per il resto del processo: avevano cuocere le cose un po 'diverso .." e hanno quella foto di un cuoco che a quanto pare ha fatto qualcosa di disgustoso alle sue pizze.

Ma non c'è niente su come utilizzare una semplice fabbrica che offre ai clienti l'accesso al metodo di cottura() o una qualsiasi delle altre parti del processo. E non c'è niente nell'usare un metodo di fabbrica che possa essere d'aiuto in caso di problemi.

Quindi mi sembra la ragione Head First implica per l'utilizzo di un metodo factory per una banale fabbrica è falso ..

+0

Vedo il tuo punto ed ero confuso da questo anche. Penso che il loro punto sia che determinati comportamenti possono essere applicati nelle sottoclassi implementandole nella classe base (astratta). –

risposta

1

Confronta diagrammi UML a pagina 117 e 131. Il punto è, così semplice fabbrica decide come cuocere una pizza per un PizzaStore. Il metodo di fabbrica consente al concreto PizzaFactory di decidere come cuocere una pizza. Le fabbriche riguardano la gestione delle dipendenze. Usando il costruttore, devi decidere quale classe istanziare. Usando una semplice fabbrica, lasci alle classi concrete decidere quale classe istanziare. Usando il metodo Factory si lascia a qualsiasi classe (che può) decidere quale classe istanziare. Usando la Fabbrica astratta lasci che qualsiasi classe (che può) decida quale classe istanziare indipendentemente dal tipo di istanza che vuoi creare. L'inversione del controllo sta usando ciò che hai ottenuto, perché la decisione è stata presa quando l'esistenza divina ti ha creato.

La mia opinione personale è che originale libro Design Pattern da GoF, pur essendo non così buono a spiegare, ha più esempi reali.

1

Analizzare le differenze in termini di ruoli diversi: utenti di A e fornitori di A. Gli schemi hanno implicazioni diverse per questi ruoli, questi sono significativi in ​​quanto le cose cambiano nel tempo.

Nel caso di

A myA = new SomeConcreteA() 

i clienti di un sapere nulla circa il fatto che B esiste nemmeno. La scelta di un particolare calcestruzzo A potrebbe essere influenzata da alcuni documenti che utilizza particolari Bs o alcune completamente altre caratteristiche della famiglia A. I fornitori di A si assumono la responsabilità di creare tutti i sapori del calcestruzzo A, quindi è probabile che abbiano del lavoro da fare quando cambiano cose come i tipi di B.

Nel caso di

A myA = new A(myBFactory()) 

Il cliente ora ha bisogno di conoscere B e le loro fabbriche e ha il controllo completo su cui fabbrica da utilizzare. Il fornitore ha dato al cliente molta più responsabilità, e forse abbiamo aumentato l'accoppiamento - il codice cliente ora dipende esplicitamente da almeno un'altra classe. Il fornitore di A non ha lavoro da fare quando arrivano nuovi tipi di B.

Nota che stiamo iniettando la fabbrica B e quindi durante la scrittura dei test delle unità client ora possiamo fornire molto più facilmente i mock per Bs, quindi il testing del client tende a essere più semplice. In generale, trovo che io uso questa appraoch di iniezione più frequentemente per questo motivo.

0

Hai ragione nel senso che tutto ciò che sembra cambiare da Fabbrica semplice a Metodo di fabbrica è che in Fabbrica semplice la fabbrica è passata attraverso il costruttore e l'abbiamo usata per creare il nostro oggetto. In Factory Method la chiamata è ora ad un metodo astratto nella nostra classe factory astratta; ma questo è potente. Poiché il metodo è astratto, dovrà essere implementato nelle nostre sottoclassi che è ciò che desideriamo. Le nostre sottoclassi possono implementare le proprie variazioni ma determinati comportamenti sono ancora applicati dalla nostra classe astratta. Ciò che è ancora più potente è che possiamo estendere il numero di fabbriche senza modificare il codice originale semplicemente aggiungendo nuove classi che ereditano dalla classe base astratta.