Я думаю, что большинство разработчиков проходят фазу синглтона, где у вас есть все, что вам нужно, у вас под рукой множество замечательных синглетонов.
Тогда вы обнаружите, что юнит-тестирование с помощью Singletons может быть трудным. Вы на самом деле не хотите подключаться к базе данных, но ваш синглтон делает. Добавьте слой перенаправления и смоделируйте его.
Тогда вы обнаружите, что юнит-тестирование не единственный раз, когда вам нужно другое поведение. Вы делаете свой Singleton настраиваемым, чтобы иметь различное поведение в зависимости от параметра. Вы начинаете задаваться вопросом, нужно ли вам разделить его на два синглета. Тогда вашему коду нужно знать, какой Singleton использовать, поэтому вам нужен Singleton, который знает, какой Singleton использовать.
Тогда какой-то другой код начинает связываться со значениями в вашем синглтоне, пока вы его используете. Как они посмели! Если бы вы хотели, чтобы кто-то мог получить эти значения откуда угодно, вы бы сделали их глобальными ...
Как только вы дойдете до этой точки, вы начинаете задаваться вопросом, были ли синглтоны правильным решением. Вы начинаете видеть опасности глобальных данных, особенно в рамках ОО, где вы просто предполагаете, что ваши данные не будут выкованы другими людьми.
Итак, вы вернетесь и начнете передавать данные, а не искать их (раньше это называлось хорошим дизайном ОО, но теперь у него есть причудливое имя, например «Внедрение зависимости»).
В конце концов вы узнаете, что синглтоны хороши в умеренности. Вы учитесь распознавать, когда ваш синглтон должен перестать быть одиноким.
Таким образом, вы получаете общие объекты, такие как UIApplication и NSUserDefaults. Это хорошее применение Singletons.
Я был достаточно обожжен в увлечении Java Singleton десять лет назад. Я даже не рассматриваю возможность написания своих собственных синглетонов. Единственный раз, когда мне нужно что-то подобное в недавней памяти, это желание кэшировать результат [NSCalendar currentCalendar] (что занимает много времени). Я создал категорию в NSCalendar и кэшировал ее как статическую переменную. Я чувствовал себя немного грязным, но альтернативой был мучительно медленный код.
Подведем итог и для тех, кто тл; др:
Синглтоны - это инструмент. Они вряд ли будут подходящим инструментом, но вы должны открыть это сами.