Siento que mi otra respuesta representa el caso general, pero el OP comentó pidiendo detalles (por lo que sentí que merecía una respuesta separada). Lamentablemente, no estoy familiarizado con el patrón de repositorio, pero voy a apuñalar a los demás. Como regla, creo que la mejor manera de explicar esto es a través del problema que desea resolver, por qué desea resolverlo y cómo lo logra.
único
Este patrón se utiliza cuando queremos garantizar que solo haya uno de algo. El patrón se logra evitando que otros creen nuestro objeto.
Wikipedia
MVC
Este patrón se utiliza para ayudar a mantener las cosas modulares con todos los beneficios que conlleva. La Vista es la "interfaz de usuario", el Modelo son los datos (incluida la lógica de negocios) y el Controlador es cómo las acciones del usuario manipulan el modelo. Con esta modularidad, nada me impide tener múltiples vistas / controladores para trabajar con el mismo modelo. Para un ejemplo demasiado simplificado, puedo interactuar con mi correo electrónico ("modelo") a través de un sitio web, una aplicación de escritorio y mi iPhone ("vistas + controladores"). Si tengo un buzón de grupo compartido, podría crear un controlador que no envíe correos electrónicos y reutilizar la misma vista de aplicación y correo electrónico. (sí, demasiado simplista, pero espero que sea comprensible :))
Además, con esta separación de preocupaciones bien definida, los cambios en uno (idealmente) no requieren cambios en otro. Ejemplo concreto, si necesito soportar la lectura / escritura en una base de datos MySQL en lugar de una base de datos Oracle, solo necesitaría cambiar mi modelo, y mi vista / controlador no cambia.
Wikipedia
Fábrica
Hay que tener cuidado aquí, ya que hay muchos patrones similares llamados Factory ... Hablaré de Abstract Factory , pero debes saber que también hay un patrón de Factory Method .
Básicamente, usaría una Fábrica abstracta cuando sepa qué pasos quiero realizar, pero los pasos sobre cómo realizar estos pasos individuales podrían variar. Por ejemplo, podría estar creando una aplicación donde necesito crear un cuadro de diálogo con un botón. Al hacer que mi código use una fábrica de IU hipotética, si necesito mi código en Mac o Linux en lugar de Windows, solo proporciono una fábrica diferente, y el resto de mi código no cambia. Para un ejemplo potencialmente más salvaje, podría tener una Web Factory y, de repente, la mayoría del código que respalda mi aplicación de escritorio ahora también está impulsando un sitio web rico :) (ok poco práctico por otras razones, pero en teoría :))