Sinto que minha outra resposta representa o caso geral, mas o OP comentou solicitando detalhes (então achei que merecia uma resposta separada). Infelizmente, não estou familiarizado com o padrão do Repositório, mas vou dar uma facada nos outros. Como regra, acho que a melhor maneira de explicar isso é através de qual problema você deseja resolver, por que deseja resolvê-lo e como o problema o alcança.
Singleton
Esse padrão é usado quando queremos garantir que exista apenas um de algo. O padrão é realizado impedindo que outros criem nosso objeto.
Wikipedia
MVC
Esse padrão é usado para ajudar a manter as coisas modulares com todos os benefícios que acompanham isso. A Visualização é a "interface do usuário", o Modelo são os dados (incluindo a lógica de negócios) e o Controlador é como as ações do usuário manipulam o modelo. Com essa modularidade, nada me impede de ter várias visualizações / controladores para trabalhar com o mesmo modelo. Para um exemplo excessivamente simplificado, posso interagir com meu email ("modelo") por meio de um site, aplicativo de desktop e meu iPhone ("visualizações + controladores"). Se eu tiver uma caixa de correio de grupo compartilhada, poderia criar um controlador que não enviaria email e reutilizaria a mesma exibição e email do aplicativo. (Sim excessivamente simplista, mas espero que compreensível :))
Além disso, com essa separação bem definida de preocupações, as mudanças em uma (idealmente) não exigem mudanças na outra. Exemplo concreto, se eu precisar dar suporte à leitura / gravação em um banco de dados MySQL em vez de um banco de dados Oracle, eu precisaria apenas mudar meu modelo e minha visão / controlador não será alterada.
Wikipedia
Fábrica
Tenha cuidado aqui, já que existem muitos padrões semelhantes chamados Factory ... Vou falar sobre a Abstract Factory , mas você deve saber que também existe um padrão Factory Method .
Basicamente, eu usaria um Abstract Factory quando souber quais etapas quero executar, mas as etapas de como realizar essas etapas individuais podem variar. Por exemplo, eu poderia estar criando um aplicativo em que preciso criar uma caixa de diálogo com um botão. Ao fazer com que meu código use uma fábrica de interface do usuário hipotética, se eu precisar do meu código no Mac ou Linux em vez do Windows, forneço apenas uma fábrica diferente e o restante do meu código não muda. Para um exemplo potencialmente mais selvagem, eu poderia ter uma Web Factory e, de repente, a maior parte do código que suporta meu aplicativo de desktop agora também está alimentando um site rico :) (ok, impraticável por outros motivos, mas em teoria :))