Ответ 1
http://sites.google.com/site/steveyegge2/singleton-considered-stupid
Почему Синглтон настолько привлекателен? Я буду первым, кто признается: мне тоже понравилось. Нет, поцарапать это - мне понравился Синглтон. Он почувствовал себя старым другом с того момента, как я посмотрел на него. Это было просто и красиво.
Я скажу вам, почему: это потому, что шаблон Singleton - это возврат к программированию, отличному от OO. Это спасательный круг для людей, которые не понимали ни единого слова, которое пытались сказать банда Четырех. Я не знаю, как он попал туда, в первую очередь, - какое-то политическое давление ООПСЛ, без сомнения, - но оно там не принадлежит. Это зло...
Вот краткое резюме...
a) Я не затронул даже десятую часть вопросов. Но я назову несколько из них.
b) Один из них - управление памятью; Синглтон в основном просто утечка памяти, если никто не будет использовать его какое-то время. Но вы не знаете, когда его освободить, потому что никто не позвонит вам и не скажет "никто не будет использовать вас какое-то время!"
Кроме того, вы не можете сказать, кто хранит ссылки на ваш экземпляр Singleton, так как вы были довольно хладны из-за его раздачи, не так ли? (Примечание: слабые ссылки Java могут помочь с этой проблемой).
c) Говоря об утечках памяти, что, если ваш Singleton имеет дескриптор некоторого ограниченного ресурса, например, базы данных или дескриптора файла? Я думаю, вы доберетесь до того, что ваша присоска будет открыта, пока ваша программа не закончится. Слава богу, программы на С++ никогда не длились дольше, чем за 10 минут до срыва, как правило, из-за нехватки ресурсов или от попыток доступа к Singleton, который кто-то освободил.
d) Другая проблема заключается в том, что дизайн Singleton синтаксически шумный; большинство языков этого не поддерживают (ну, к сожалению, Руби делает это, к сожалению, но это было, вероятно, до того, как Мац знал, что лучше), поэтому вы должны придерживаться шаблона кода не только в Синглтоне, но и во всех, кто его использует.
e). Тогда есть подклассификация. Почти невозможно подклассифицировать Синглтон, и если вы справляетесь с этим, то вам не следует использовать Singleton в первую очередь. Вы даже не хотите туда ехать. Я гулял по дорогам, о которых не смею рассказывать. Просто притворяйтесь, что вы не можете этого сделать, и вы сэкономите себе огромное количество боли.
f) статические методы столь же гибки, как и гранит. Каждый раз, когда вы используете его, вы выполняете часть своей программы в бетоне. Просто убедитесь, что у вас нет застрявшей ноги, когда вы смотрите, как она затвердевает. Когда-нибудь вы будете удивлены тем, что, черт возьми, вам действительно нужна другая реализация этого класса PrintSpooler, и он должен был быть интерфейсом, factory и набором классов реализации. D'о!
Не думайте, что все. Есть много других проблем. Например, попробуйте добавить многопоточность и посмотреть, что произойдет. Хорошо, я расскажу вам, что происходит: в половине случаев вы получаете Doubleton или Tripleton, если только вы не являетесь специалистом по синхронизации, и наличие Tripleton примерно так же желательно, как наличие трех Balrogs на чаепитии. И даже если вы специалист по синхронизации и получите идиому с двойной проверкой, у вас все еще есть один Бэлрог, и они не пикник.
Но эти проблемы все угасают в незначительности по сравнению с Большим, а именно, что "шаблон" Singleton побуждает вас забыть все, что вы знаете о дизайне OO, поскольку OO сложно, а процедурный просто...