Существуют ли жизнеспособные альтернативы синглтон-модели GOF? - PullRequest
87 голосов
/ 02 октября 2008

Посмотрим правде в глаза. Шаблон Singleton - это весьма спорная тема с программистами полчищ на обеих сторонах забора. Есть те, кто чувствует, что Синглтон - не что иное, как прославленная глобальная переменная, и другие, которые клянутся по шаблону и непрерывно используют его. Однако я не хочу, чтобы Одиночная борьба лежала в основе моего вопроса. Каждый может взять на себя перетягивание каната и сразиться с ним, и посмотреть, кто победит, несмотря на все мои заботы . То, что я пытаюсь сказать, - я не верю, что есть единственный правильный ответ, и я не намеренно пытаюсь разжечь партизанские разногласия. Меня просто интересуют синглтон-альтернатив , когда я задаю вопрос:

Есть ли у них какие-либо конкретные альтернативы синглтон-модели GOF?

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

Какая еще у вас идея?

РЕДАКТИРОВАТЬ: Я не хочу, чтобы это был еще один пост о том, "как правильно использовать синглтон". Опять же, я ищу способы избежать этого. Ради прикола, хорошо? Я полагаю, что задаю чисто академический вопрос вашим лучшим трейлером фильма: «В параллельной вселенной, где нет синглтона, что мы можем сделать?»

Ответы [ 16 ]

0 голосов
/ 02 октября 2008

Я использую синглтон в основном как «контейнер методов», вообще без состояния. Если мне нужно поделиться этими методами со многими классами, и я хочу избежать бремени создания экземпляров и инициализации, я создаю контекст / сеанс и инициализирую все классы там; все, что относится к сеансу, также имеет доступ к содержащемуся в нем «синглтону».

0 голосов
/ 02 октября 2008

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

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

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

0 голосов
/ 02 октября 2008

Что вы имеете в виду, каковы мои методы, чтобы избежать этого?

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

Но нет. Мне не нужно избегать синглтон-паттернов. Это просто не возникает.

0 голосов
/ 02 октября 2008

Лично для меня гораздо более разумный способ реализовать что-то, что ведет себя как синглтон, - это использовать полностью статический класс (статические члены, статические методы, статические свойства). Большую часть времени я реализую это таким образом (я не могу думать о каких-либо различиях в поведении с точки зрения пользователя)

0 голосов
/ 02 октября 2008

На самом деле, если вы разрабатываете с нуля, избегая Singelton, вам, возможно, не придется обходиться без использования Singletons с помощью статических переменных. При использовании статических переменных вы также более или менее создаете Singleton, единственное отличие состоит в том, что вы создаете разные экземпляры объектов, однако внутренне все они ведут себя так, как если бы они использовали Singleton.

Можете ли вы привести подробный пример, где вы используете синглтон или где синглтон используется в настоящее время, и вы пытаетесь избежать его использования? Это может помочь людям найти более причудливое решение, как можно было бы справиться с ситуацией без единого синглтона.

Кстати, лично у меня нет проблем с синглетонами, и я не могу понять проблемы, с которыми сталкиваются другие люди в отношении синглетонов. Я не вижу в них ничего плохого. То есть если вы ими не злоупотребляете. Любой полезный метод может быть нарушен, и в случае злоупотребления это приведет к отрицательным результатам. Другой метод, который обычно используется неправильно - наследование. Тем не менее никто не сказал бы, что наследование - это что-то плохое только потому, что некоторые люди ужасно злоупотребляют им.

0 голосов
/ 02 октября 2008

Используйте обычный объект и заводской объект. Фабрика отвечает за применение политик к экземпляру и простым объектам только с информацией о конфигурации (например, в ней) и поведением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...