Attualmente sto imparando a conoscere i modelli di design. Ho imparato a conoscere il modello del metodo di fabbrica.
Questo modello significa che per implementare una fabbrica per creare oggetti, si dovrebbe sottoclasse la classe che ha bisogno di questi oggetti e la sottoclasse li creerà. In questo modo la superclasse funziona solo con riferimenti più astratti anziché con le implementazioni concrete che la sottoclasse genera, creando un design liberamente accoppiato.
Questo di solito significa che la superclasse diventa abstract
, poiché il suo metodo createObject()
deve essere abstract
in modo che la sottoclasse contenente il metodo factory debba implementare questo metodo.
Come qualsiasi modello di fabbrica, questo modello incapsula la creazione dell'oggetto concreto e consente al client di lavorare con un livello più alto di astrazione. Ma questo modello specifico è costruito sull'eredità.
Ciò che non capisco è - Perché qualcuno dovrebbe affrontare tutti i problemi della sottoclasse della classe che ha bisogno di una fabbrica e che la rende abstract
? La composizione è molto migliore per questo scopo in qualsiasi modo.
Ha molto più senso creare una classe astratta o un'interfaccia chiamata Factory
. Dichiarerebbe un metodo: createObject()
. Noi creiamo implementazioni concrete di esso per scopi diversi ( WeaponFactory
, TitleFactory
..) Quindi, forniamo al cliente un Factory
istanza membro factory
. Questo riferimento è impostato su qualsiasi cosa concreta Factory
è necessaria al runtime e il client può semplicemente utilizzare factory
's createObject()
quando necessario (senza dover sapere quale implementazione concreta factory
è di mantenimento).
Non capisco perché si debba passare attraverso la difficoltà di sottoclassi di una classe e di renderla astratta solo per il vantaggio di consentirgli di utilizzare una fabbrica in modo non strettamente accoppiato.
Il semplice design basato sulla composizione che ho descritto è migliore in ogni caso, credo.
Sei d'accordo? Potresti spiegare perché qualcuno userebbe il modello di metodo di fabbrica che ho descritto?