Я вважаю, що моя інша відповідь виступає за загальний випадок, але ОП прокоментував конкретні запитання (тому я вважав, що це заслуговує окремої відповіді). На жаль, я не знайомий із шаблоном сховища, але я зроблю удар у інших. Як правило, я вважаю, що найкращий спосіб пояснити це через те, яку проблему ви хочете вирішити, чому ви хочете її вирішити і як проблема її виконує.
Сінглтон
Ця модель використовується тоді, коли ми хочемо гарантувати, що є щось одне. Шаблон досягається тим, що інші люди не можуть створити наш об’єкт.
Вікіпедія
MVC
Ця закономірність використовується, щоб допомогти зберегти модульну інформацію з усіма перевагами, які випливають із цього. Вид - це "інтерфейс користувача", Модель - це дані (включаючи логіку бізнесу), а Контролер - це те, як дії користувача маніпулюють моделлю. З цією модульністю ніщо не заважає мені мати кілька переглядів / контролерів для роботи з однією і тією ж моделлю. Для надто спрощеного прикладу я можу взаємодіяти зі своєю електронною поштою ("моделлю") через веб-сайт, настільний додаток та свій iPhone ("перегляди + контролери"). Якщо у мене є спільна групова скринька, я можу створити контролер, який не надсилатиме електронну пошту, і повторно використовувати те саме перегляд програми та електронну пошту. (так надмірно спрощено, але, сподіваюся, зрозуміло :))
Крім того, при цій чітко визначеній відокремленості проблем зміни в одному (в ідеалі) не потребують змін в іншому. Конкретний приклад: якщо мені потрібно підтримувати читання / запис у базу даних MySQL замість бази даних Oracle, мені потрібно буде лише змінити свою модель, і мій погляд / контролер не змінюється.
Вікіпедія
Заводська
Тут треба бути обережними, оскільки існує багато подібних шаблонів під назвою Фабрика ... Я розповім про абстрактну фабрику , але ви повинні знати, що існує також модель « Фабричний метод» .
В основному, я використовував би абстрактну фабрику, коли знаю, які дії я хочу виконати, але кроки щодо виконання цих невидимих кроків можуть відрізнятися. Наприклад, я можу будувати додаток, де мені потрібно створити діалогове вікно з кнопкою на ньому. Якщо мій код використовує гіпотетичну фабрику інтерфейсу користувача, якщо мені потрібен код на Mac чи Linux замість Windows, я просто надаю іншу фабрику, а решта коду не змінюється. Для потенційно дивного прикладу, я міг би створити веб-фабрику, і раптом більша частина коду, що підтримує мою настільну програму, тепер також працює на багатому веб-сайті :) (нормально з інших причин, але теоретично :))