Sento che la mia altra risposta sta per il caso generale, ma l'OP ha commentato chiedendo dei dettagli (quindi ho ritenuto che meritasse una risposta separata). Purtroppo non ho familiarità con il modello del repository, ma prenderò una pugnalata agli altri. Di norma, penso che il modo migliore per spiegarli sia attraverso quale problema si vuole risolvere, perché lo si vuole risolvere e come il problema lo porta a termine.
Singleton
Questo schema è usato quando vogliamo garantire che ce ne sia solo uno. Il modello si ottiene impedendo ad altri di creare il nostro oggetto.
Wikipedia
MVC
Questo modello è usato per mantenere le cose modulari con tutti i vantaggi che ne derivano. La vista è l '"interfaccia utente", il modello è i dati (inclusa 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 troppo semplificato, posso interagire con la mia email ("modello") attraverso un sito Web, un'applicazione desktop e il mio iPhone ("viste + controller"). Se ho una casella postale di gruppo condivisa, potrei creare un controller che non invii email e riutilizzare la stessa vista applicativa ed e-mail. (sì, troppo semplicistico, ma si spera comprensibile :))
Inoltre, con questa separazione ben definita dei problemi, i cambiamenti in uno (idealmente) non richiedono modifiche in un altro. Esempio concreto, se ho bisogno di supportare la lettura / scrittura su un database MySQL invece che su un database Oracle, ho solo bisogno di cambiare il mio modello, e la mia vista / controller non cambia.
Wikipedia
Fabbrica
Devi stare attento qui dato che ci sono molti modelli simili chiamati Factory ... Parlerò della Fabbrica astratta , ma dovresti sapere che esiste anche un modello Metodo di fabbrica .
Fondamentalmente, vorrei utilizzare una Fabbrica astratta quando so quali passi voglio eseguire, ma i passaggi su come eseguire questi passaggi individuali potrebbero variare. Ad esempio, potrei creare un'applicazione in cui è necessario creare una finestra di dialogo con un pulsante. Avendo il mio codice utilizzare un'ipotetica interfaccia utente, se ho bisogno del mio codice su Mac o Linux anziché su Windows, fornisco semplicemente un factory diverso e il resto del mio codice non cambia. Per un esempio potenzialmente più selvaggio, potrei avere una Web Factory e improvvisamente la maggior parte del codice che supporta la mia applicazione desktop sta ora alimentando anche un sito Web ricco :) (ok, non pratico per altri motivi, ma in teoria :))