Должны ли мы запечатать Singletons? Должны ли мы пытаться унаследовать от синглетонов в первую очередь? - PullRequest
5 голосов
/ 04 апреля 2010

Должен ли класс Singleton иметь детей? Должны ли мы это запечатать? Какие плюсы и минусы?

Чтобы иметь возможность наследовать от класса Singleton, нам нужно сделать конструктор защищенным, а не закрытым. Теперь это будет хорошо в c #, но защищенное слово в java предоставляет и дочерним классам, и пакетным классам доступ к конструктору. Это означает, что не только классы, которые наследуются от нашего Singleton, могут обращаться к конструктору, но и другие классы в том же пакете могут это делать.

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

Спасибо

Ответы [ 5 ]

8 голосов
/ 04 апреля 2010

Да, синглтоны должны быть запечатаны. Нет, они не должны наследоваться.

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

Либо это, либо вы столкнетесь с условиями гонки или другими конфликтами, поскольку «производные» синглтоны борются за контроль над глобальным экземпляром, который не только не имеет смысла, но и опасен.

Есть некоторые хакерские обходные пути к проблеме наследования Singleton, но это то, чем они являются - хаки. Шаблон Singleton не очень подходит для наследования.

8 голосов
/ 04 апреля 2010

Лучшим решением является использование контейнера IoC для обработки аспекта класса «Singleton» (время жизни). В этот момент вы можете использовать POJO и просто наследовать от него.

РЕДАКТИРОВАТЬ: Некоторые ссылки, которые могут помочь:

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

4 голосов
/ 04 апреля 2010

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

http://msmvps.com/blogs/jon_skeet/archive/2006/01/20/singleton-inheritance.aspx http://msdn.microsoft.com/en-us/library/84eaw35x.aspx

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

3 голосов
/ 04 апреля 2010

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

2 голосов
/ 04 апреля 2010

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

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