Sento che la mia altra risposta rappresenta il caso generale, ma l'OP ha commentato chiedendo dettagli (quindi ho ritenuto che meritasse una risposta separata). Purtroppo non ho familiarità con il modello del Repository, ma mi prenderò cura degli altri. Di regola, penso che il modo migliore per spiegarli sia attraverso quale problema vuoi risolvere, perché vuoi risolverlo e come il problema lo compie.
Singleton
Questo modello viene utilizzato quando vogliamo garantire che ci sia solo uno di qualcosa. Il modello è realizzato impedendo ad altri di creare il nostro oggetto.
Wikipedia
MVC
Questo modello viene utilizzato per aiutare a mantenere le cose modulari con tutti i vantaggi che ne derivano. La vista è "l'interfaccia utente", il modello è i dati (compresa la logica aziendale) e il controller è il modo in cui le azioni dell'utente manipolano il modello. Con questa modularità, nulla mi impedisce di avere più viste / controller per lavorare con lo stesso modello. Per un esempio eccessivamente semplificato, posso interagire con la mia e-mail ("modello") tramite un sito Web, un'applicazione desktop e il mio iPhone ("visualizzazioni + controller"). Se ho una cassetta postale di gruppo condivisa, potrei creare un controller che non invierebbe e-mail e riutilizzare la stessa vista applicazione e la stessa e-mail. (sì, eccessivamente semplicistico, ma speriamo comprensibile :))
Inoltre, con questa ben definita separazione delle preoccupazioni, i cambiamenti in uno (idealmente) non richiedono cambiamenti in un altro. Esempio concreto, se devo supportare la lettura / scrittura su un database MySQL anziché su un database Oracle, dovrei solo cambiare il mio modello e la mia vista / controller non cambia.
Wikipedia
Fabbrica
Devi stare attento qui poiché ci sono molti modelli simili chiamati Factory ... Parlerò della Fabbrica astratta , ma dovresti sapere che esiste anche un modello Metodo di fabbrica .
Fondamentalmente, userei una Fabbrica astratta quando so quali passaggi voglio eseguire, ma i passaggi su come eseguire questi passaggi individuali potrebbero variare. Ad esempio, potrei creare un'applicazione in cui devo creare una finestra di dialogo con un pulsante su di essa. Facendo in modo che il mio codice utilizzi un'ipotetica factory dell'interfaccia utente, se ho bisogno del mio codice su Mac o Linux anziché Windows, fornisco solo una factory diversa e il resto del mio codice non cambia. Per un esempio potenzialmente selvaggio, potrei avere una Web Factory e improvvisamente la maggior parte del codice che supporta la mia applicazione desktop ora sta anche alimentando un sito Web ricco :) (ok poco pratico per altri motivi, ma in teoria :))