2011-11-30 18 views

risposta

20

Una fabbrica crea oggetti per voi, quando richiesto.

Il localizzatore di servizi restituisce oggetti che potrebbero già esistere, ovvero servizi che potrebbero già esistere da qualche parte.

Basta pensare al significato dei nomi:

  • fabbrica: è un luogo dove si creano oggetti.
  • Servizio: è qualcosa che può fare qualcosa per te come servizio.
  • Localizzatore di servizi: è qualcosa che può trovare qualcosa che può eseguire un servizio.
+0

Il servizio alla fine è una classe, che fa qualcosa. Per recuperarlo deve essere creato in modo ... il Service Locator è come una fabbrica, perché deve creare un "nuovo" – toroveneno

+3

Non è necessario creare un nuovo oggetto servizio ... invece l'oggetto servizio sarà registrato prima di provare a localizzare il servizio, potrebbe essere quando l'applicazione si avvia, in modo che in futuro il localizzatore di servizio possa restituire quel servizio a un chiamante. –

+0

Come la "semplicità" della risposta – Spock

6

In realtà c'è una netta separazione tra questo schema. È risaputo che entrambi i pattern sono utilizzati per evitare dipendenze da tipi concreti.

Tuttavia dopo leggere

Alcune contraddizioni gravi sorge spontanea:

Seemann ha detto: "An Abstract Factory è un tipo generico, e il il tipo restituito del metodo Create è determinato dal tipo di factory stesso. In altre parole, un tipo costruito può restituire solo istanze di un singolo tipo. "

Mentre Rober C. Martin non ha menzionato nulla sui tipi generici e inoltre, l'esempio di fabbrica nel suo libro consente di creare istanze di più tipi di oggetti distinguere tra loro utilizzando una stringa di chiavi come parametro in Factory.Make().

Gamma ha detto che l'intento di Abstract Factory è di "Fornire un'interfaccia per creare famiglie di oggetti correlati o dipendenti senza specificare le loro classi concrete". Vale la pena menzionare che l'esempio di Gamma Abstract Factory viola l'Interfaccia Segregation Principle (ISP) dichiarato da Martin. ISP e SOLID in generale sono principi più moderni o forse per semplicità dove omessi.

Le opere di Gamma e Martin precedono quelle di Seemann, quindi penso che dovrebbe seguire la definizione già fatta.

Mentre Fowler propone Service Locator come metodo per implementare Dependency Inversion, Seemann lo considera un anti-pattern. Né Gamma o Martin menzionano Localizzatore di servizi.

Tuttavia, Seemann e Fowler hanno concordato che Service Locator necessita di una fase di configurazione per registrare un'istanza di una classe di calcoli, quell'istanza è ciò che verrà restituito in seguito quando verrà richiesto un oggetto di quel tipo. Questa fase di configurazione non è menzionata da Martin o Gamma nella loro definizione di Abstract Factory. Il modello Abstract Factory suppone che un nuovo oggetto sia istanziato ogni volta che un oggetto di quel tipo viene richiesto.

Conclusione

La differenza principale tra Service Locator e Abstract Factory è che Abstract Factory supponiamo che un nuovo oggetto un'istanza di una restituito ad ogni richiesta e Service Locator deve essere configurato con un'istanza oggetto e ogni volta che il stessa istanza verrà restituita.

Problemi correlati