Ecco due modi per creare un'istanza di un oggetto:
Opzione 1:
Thing thing = new Thing();
Opzione 2: (la fabbrica è una fabbrica statica, ma potrebbe anche essere una fabbrica semplice).
Thing thing = ThingFactory.createThing();
Dove:
class ThingFactory(){
public static Thing createThing(){
return new Thing();
}
}
L'opzione 2 è considerata migliore, perché l'utilizzo di una fabbrica disaccoppia il codice cliente dall'implementazione concreta della classe che sta creando un'istanza.
Tuttavia, che differenza fa effettivamente se uso new Thing()
o factory.createThing()
? L'unica differenza tra le due opzioni è che il codice di istanza viene spostato in un posto diverso.
Come ho spiegato sopra, conosco la spiegazione "accademica" del perché usare una fabbrica è "migliore", ma in realtà non ne vedo il vantaggio pratico. In entrambi i casi, il client sa esattamente cosa vuole: a Thing
. L'unica differenza è l'esatta riga di codice: new Thing()
o factory.createThing()
.
Le fabbriche più sofisticate, posso vedere i loro benefici. Ad esempio, utilizzando il pattern Abstract Factory, potrei creare diverse sottoclassi di Factory
che istanziano diverse implementazioni concrete di Thing
e iniettare l'adatto Factory
al client in fase di esecuzione, senza che il cliente si preoccupi dell'implementazione concreta ricevuta. BlueThingFactory
istanzia BlueThing
, RedThingFactory
istanzia RedThing
, ma il cliente si preoccupa solo che riceva un Thing
.
Questo è con fabbriche più sofisticate.
Ma non sono in grado di vedere il vantaggio di utilizzare una fabbrica semplice come nell'esempio che ho descritto. Tutto ciò che fa è spostare new Thing()
in un altro posto. Non capisco il vantaggio di questo.
Per favore, spiegami i reali benefici dell'utilizzo di un semplice stabilimento.