Шаблон "одиночка" [закрывается]

19
задан Muhit 25 July 2010 в 12:27
поделиться

4 ответа

Если у вас есть ситуация, когда для координации действий во всей системе необходим ровно один объект, то вы можете использовать этот паттерн. Хорошим примером этого является Facade, то есть Facades могут быть реализованы как синглтоны, потому что часто один объект Facade необходим всей системе.

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

5
ответ дан 30 November 2019 в 03:11
поделиться

В теории: когда вам нужно ограничить инстанцирование объекта одним экземпляром. На практике: никогда.

2
ответ дан 30 November 2019 в 03:11
поделиться

Когда вы хотите, чтобы куча разных объектов могла ссылаться на один единственный объект. Может быть, они хотят использовать один и тот же PhysicsEngineDude или что-то еще... Вы же не хотите, чтобы у разных объектов были разные физические модели, когда они живут в одном мире!

0
ответ дан 30 November 2019 в 03:11
поделиться

http://sites.google.com/site/steveyegge2/singleton-considered-stupid

Почему синглтон так привлекателен? Признаюсь первым: мне тоже понравилось. Нет, вычеркните это - я любил Синглтон. Я почувствовал себя старым другом с того момента, как увидел его. Это было просто и красиво.

Я скажу вам почему: это потому, что шаблон Singleton - это возврат к программированию без объектно-ориентированного программирования. Это спасательный круг для людей, которые не понимали ни единого слова, которое пыталась сказать «Банда четырех». Я не знаю, как он вообще туда попал - без сомнения, какое-то политическое давление OOPSLA - но ему здесь не место. Это зло ...

Вот «краткое» резюме ...

а) Я не затронул и десятой части вопросов. Но я назову несколько из них.

б) Первый - это управление памятью; Синглтон - это, по сути, просто утечка памяти, если никто не собирается его использовать какое-то время.Но вы не знаете, когда его освободить, потому что никто не позвонит вам и не скажет: «Никто не будет использовать вас какое-то время!»

Кроме того, вы не можете сказать, кто хранил ссылки на ваш экземпляр Singleton, раз уж вы были довольно пресыщены раздаванием, не так ли? (Примечание: слабые ссылки Java могут помочь в решении этой проблемы).

c) Говоря об утечках памяти, что, если ваш синглтон имеет дескриптор некоторого ограниченного ресурса, такого как база данных или дескриптор файла? Я думаю, тебе удастся держать эту присоску открытой до тех пор, пока твоя программа не закончится. Слава Богу, программы на C ++ никогда не работают дольше 10 минут до сбоя, обычно из-за нехватки ресурсов или попытки доступа к синглтону, который кто-то освободил.

г) Другая проблема заключается в том, что дизайн Singleton синтаксически зашумлен; большинство языков не поддерживают его (ну, Ruby, к сожалению, поддерживает, но это было, вероятно, до того, как Матц узнал что-то лучшее), поэтому вы должны придерживаться шаблонного кода не только в синглтоне, но и во всех, кто его использует.

e) Затем есть подклассы. Практически невозможно создать подкласс синглтона, и если вы справитесь с этим, то вам вообще не следовало использовать синглтон. Вы не даже хотите туда идти. Я шел по дорогам, которые не осмеливаюсь перечислять. Просто представьте, что вы не можете этого сделать, и вы избавите себя от невероятной боли.

е) статические методы гибки, как гранит. Каждый раз, когда вы его используете, вы превращаете часть своей программы в конкретную. Просто убедитесь, что ваша ступня не зажата, пока вы наблюдаете, как она затвердевает.Когда-нибудь вы будете удивлены, черт возьми, вам действительно нужна другая реализация этого чертова класса PrintSpooler, и это должен был быть интерфейс, фабрика и набор классов реализации. Ооо!

Не думайте, что это все. Есть много других проблем. Например, попробуйте добавить многопоточность и посмотрите, что произойдет. Что ж, я расскажу вам, что происходит: в половине случаев вы получаете даблтон или триплетон, если вы не специалист по синхронизации, а иметь триплетон примерно так же желательно, как и три балрога появиться на вашем чаепитии. И даже если вы являетесь экспертом по синхронизации и правильно понимаете идиому «перепроверьте», у вас все равно есть один балрог, с которым нужно иметь дело, и они не для пикника.

Но все эти проблемы становятся незначительными по сравнению с Большой проблемой, которая заключается в том, что «шаблон» синглтона побуждает вас забыть все, что вы знаете об объектно-ориентированном проектировании, поскольку объектно-ориентированный дизайн сложен, а процедурный - прост ...

25
ответ дан 30 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: