Плохие И Хорошие Синглтоны

О шаблоне проектирования Gang of Four Singleton уже было сказано немало гадостей.

Вы можете прочитать о различных принципах, которые нарушает Синглтон, например: Здесь .

И, похоже, мне есть что добавить.

Первопричина всех бед с GoF Singleton в том, что для подавляющего большинства классов «синглтонность» — это деталь их реализации.

Просто эти классы удобнее реализовать, если вся система работает с одним-единственным объектом каждого.

GoF рекомендует внедрить эту деталь реализации для всех синглтонов в форме метода getInstance().

Что, если вам нужно реализовать класс по-другому? Начнутся проблемы.

Если новая реализация перестанет быть синглтоном, то придется менять не только сам класс, но и всех его клиентов, убирая все вызовы getInstance() и продумывая стратегию создания экземпляров для каждого случая заново.

Можно ли как-нибудь скрыть от клиентов это «синглтоновское» свойство класса вместе со всеми проблемами и нарушенными принципами? Существует. Это можно сделать с помощью архитектурного шаблона внедрения зависимостей/инверсии управления (IoC).

Контейнер IoC (IoCC) скрывает функцию Singleton класса от своих клиентов и берет на себя полную ответственность за управление зависимостями, освобождая Singleton от: «.

и обеспечивает глобальную точку доступа к нему.

» из определения банды из четырех человек.

Глобальная точка доступа больше не нужна; Клиенты-одиночки больше не знают точно, сколько экземпляров класса зависимостей создает для них IoCC. Например, мой любимый IoCC Гугл Гуйс позволяет пометить класс аннотацией Синглтон , но самое главное: он позволяет удалить эту аннотацию в любой момент без необходимости менять клиентов класса.

Под контролем IoCC «одиночность» всегда остается деталью реализации класса, помеченного как Синглтон .

Существуют также исключения, когда «синглтонность» действительно должна быть свойством интерфейса класса, а не деталью реализации.

Одно из таких исключений: Синглтон в наилегчайшем весе.

Например, мы пишем классы для абстрактного синтаксического дерева языка SQL, и одним из этих классов будет SqlNull. Желательно, чтобы в этом классе был один единственный объект, чтобы о нем знали все, и сравнивали этот объект с остальными только по ссылке.

В данном случае GoF Singleton нам подходит идеально.

Так.

Для классов обслуживания, т.е.

для большинства случаев, «Синглтон» — это деталь реализации и IoCC позволяет ее скрыть; для синглтонов-легковесов это часть интерфейса, и вы можете открыть ее снаружи, как предлагает GoF, используя getInstance().

Теги: #паттерны #шаблоны проектирования #дизайн и рефакторинг

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.