Я чувствую, что мой другой ответ обозначает общий случай, но ОП прокомментировал вопрос об уточнении (поэтому я чувствовал, что заслуживает отдельного ответа). К сожалению, я не знаком с шаблоном Repository, но сделаю удар по остальным. Как правило, я думаю, что лучший способ объяснить это - через какую проблему вы хотите решить, почему вы хотите ее решить и как эта проблема решается.
одиночка
Этот шаблон используется, когда мы хотим гарантировать, что есть только одно из чего-то. Образец достигнут, препятствуя другим создавать наш объект.
Википедия
MVC
Этот шаблон используется, чтобы сохранить модульность вещей со всеми вытекающими отсюда преимуществами. Представление - это «пользовательский интерфейс», Модель - это данные (включая бизнес-логику), а Контроллер - это то, как действия пользователя манипулируют моделью. Благодаря этой модульности ничто не мешает мне иметь несколько представлений / контроллеров для работы с одной и той же моделью. Для упрощенного примера я могу взаимодействовать со своей электронной почтой («модель») через веб-сайт, настольное приложение и мой iPhone («виды + контроллеры»). Если у меня есть общий почтовый ящик группы, я мог бы создать контроллер, который не будет отправлять электронную почту, и повторно использовать тот же вид приложения и электронную почту. (да слишком упрощенно, но, надеюсь, понятно :))
Кроме того, при этом четко определенном разделении проблем изменения в одном (в идеале) не требуют изменений в другом. Конкретный пример: если мне нужно поддерживать чтение / запись в базу данных MySQL вместо базы данных Oracle, мне нужно будет только изменить мою модель, и мой взгляд / контроллер не изменится.
Википедия
завод
Здесь нужно быть осторожным, так как есть много похожих шаблонов, называемых Фабрикой ... Я расскажу об Абстрактной Фабрике , но вы должны знать, что существует также шаблон Фабричного Метода .
По сути, я бы использовал Абстрактную Фабрику, когда знаю, какие шаги я хочу выполнить, но шаги по выполнению этих отдельных шагов могут отличаться. Например, я мог бы создать приложение, в котором мне нужно создать диалоговое окно с кнопкой на нем. Поскольку мой код использует гипотетическую фабрику пользовательского интерфейса, если мне нужен мой код на Mac или Linux вместо Windows, я просто предоставляю другую фабрику, а остальная часть моего кода не меняется. В качестве более дикого примера, я мог бы создать Web Factory, и внезапно большая часть кода, поддерживающего мое настольное приложение, теперь также питает богатый веб-сайт :) (хорошо, непрактично по другим причинам, но в теории :))