Situazione ipotetica: sto scrivendo una libreria di suoni che voglio eseguire su più piattaforme. Cercherò di fare in modo che il maggior numero di codice possibile sia indipendente dalla piattaforma, ma sicuramente alcuni di essi dovranno cambiare per Windows rispetto a OSX rispetto a Linux.
Così scrivo tutte queste diverse implementazioni, ma non voglio che l'utente finale debba fare il il loro programma dipendente da Linux o Windows o qualsiasi altra cosa. Inoltre, non voglio mantenere 4 interfacce diverse per la mia API. (Nota: questi sono solo alcuni dei motivi per cui potresti creare una fabbrica - ci sono certamente altre situazioni).
Quindi definisco questa bella classe generica di base SoundObject
che definisce tutti i metodi che il client può utilizzare. Quindi faccio il mio LinuxSoundObject
, WindowsSoundObject
e altri 5 derivano da SoundObject
. Ma nasconderò tutte queste implementazioni concrete all'utente e fornirò solo un SoundObject
. Invece, devi chiamare il mio SoundObjectFactory
per afferrare quello che sembra essere un semplice vecchio SoundObject
, ma in realtà ho scelto il tipo di runtime corretto per te e l'ho creato io stesso.
2 anni più tardi, un nuovo sistema operativo viene fuori e sposta Windows. Invece di obbligarti a riscrivere il tuo software, aggiorno semplicemente la mia libreria per supportare la nuova piattaforma e non vedi mai una modifica all'interfaccia.
Questo è tutto abbastanza artificioso, ma si spera che tu abbia l'idea.
Le fabbriche isolano i consumatori di un'interfaccia da quale tipo di runtime (vale a dire l'implementazione) viene effettivamente utilizzato.
fonte
2010-02-11 23:37:38
Quindi per qualcosa di simile non è davvero necessario? Considerando che userò sempre istanze di SoundObject * e solo un singleton del manager. –
Se non si hanno sottotipi SoundObject diversi, direi "no". – duffymo
Non proprio, l'intento nell'impiegare lo schema è di isolare la creazione di oggetti dal loro utilizzo. Ciò consente di introdurre nuovi tipi derivati senza alcuna modifica al codice che utilizza la classe base. Probabilmente hai sottotipi di SoundObject, ma semplicemente non lo sai, la Factory ti isola da quei dettagli di implementazione –