Я не ненавижу синглетонов, но я знаю, что ими злоупотребляют, и по этой причине я хочу научиться избегать их использования, когда они не нужны.
Я разрабатываю приложение для кроссплатформенности (Windows XP / Vista / 7, Windows Mobile 6.x, Windows CE5, Windows CE6). В рамках этого процесса я реорганизую код в отдельные проекты, чтобы уменьшить дублирование кода и, следовательно, шанс исправить ошибки исходной системы.
Одна из таких частей приложения, которая создается отдельно, довольно проста, это менеджер профилей. Этот проект отвечает за хранение профилей. Он имеет класс Profile
, который содержит некоторые данные конфигурации, которые используются всеми частями приложения. Он имеет класс ProfileManager
, который содержит Profiles
. ProfileManager
будет считывать / сохранять Profiles
в виде отдельных файлов XML на жестком диске и позволять приложению извлекать и устанавливать «активный» Profile
. Простой.
В первой внутренней сборке графический интерфейс был анти-паттерном SmartGUI. Это была реализация WinForms без MVC / MVP, потому что мы хотели, чтобы она работала быстрее, а не была хорошо спроектирована. Это привело к тому, что ProfileManager
был единственным. Это было так из любой точки приложения, графический интерфейс мог получить доступ к активной Profile
.
Это означало, что я мог просто пойти ProfileManager.Instance.ActiveProfile
, чтобы получить конфигурацию для различных частей системы по мере необходимости. Каждый GUI также может вносить изменения в профиль, поэтому у каждого GUI есть кнопка сохранения, поэтому у них всех также был доступ к методу ProfileManager.Instance.SaveActiveProfile()
.
Я не вижу ничего плохого в использовании синглтона здесь, и потому что я не вижу в этом ничего плохого, я знаю, что синглтоны не идеальны. Есть ли лучший способ, которым это должно обрабатываться? Должен ли экземпляр ProfileManager передаваться в каждый контроллер / презентатор? Когда создан ProfileManager, следует ли создавать другие основные компоненты и регистрироваться в событиях при изменении профилей. Пример довольно прост и, вероятно, является общей чертой во многих системах, поэтому думаю, что это отличное место, чтобы научиться избегать одиночных игр.
P.s. Мне нужно создать приложение на основе Compact Framework 3.5, который ограничивает множество обычных классов .Net Framework, которые можно использовать.