Simple. Что делает синглтон?
- Предоставляет глобальный доступ к экземпляру объекта, а
- Это гарантирует, что никогда не может быть создано более одного экземпляра этого типа.
Таким образом, вы используете синглтон, когда вам нужно оба этих вещей.
И это редко.
Глобалы вообще говоря, плохо. Мы стараемся избегать их, когда это возможно.
И построение вашего приложения на предположении, что «если существует более одного экземпляра, это ошибка», опасно, потому что вы обычно обнаруживаете, что это предположение не выполняется. Возможно, вы хотите иметь возможность создавать несколько экземпляров локально для целей кэширования. Возможно, вам требуется более одной базы данных, более одного журнала или, возможно, производительность потоков требует, чтобы вы предоставили каждому потоку свой экземпляр.
В любом случае вам не нужно применять предположение «может существовать только один экземпляр». Если вам нужен только один экземпляр, просто создайте только один экземпляр. Но оставьте конструктор публично видимым, чтобы можно было создать больше экземпляров , если это окажется необходимым .
Другими словами, обе функции, предлагаемые синглтоном, на самом деле являются отрицательными. В общем, мы не хотим, чтобы наши данные были видны во всем мире, и мы не хотим, чтобы лишали гибкости без причины.
Если вам нужна одна из функций, предлагаемых синглтоном, реализуйте эту одну функцию без другой. Если вам нужно что-то глобально доступное, сделайте это глобальным. Не синглтон. И если вам нужно обеспечить, чтобы существовал только один экземпляр (я не могу придумать каких-либо вероятных ситуаций, в которых вы хотели бы этого), то реализуйте это без глобальной видимости.
Единственное применение синглетонов в реальном мире, которое я когда-либо видел, было «архитектор прочитал книгу GoF и решил повсюду втирать шаблоны проектирования», или «какой-то программист, застрявший в 80-х, не доволен вся эта «объектно-ориентированная» вещь, и она требует процедурного кодирования, что означает хранение данных в виде глобалов. А синглтоны звучат как «ООП» способ создания глобалов, не крича на ».
Ключевым моментом является то, что синглтон сочетает в себе две, очень разные, и очень редко необходимые обязанности. Как правило, вы хотите самое большее один из них в любом данном объекте.