Разница между статическим классом и одноэлементным шаблоном? - PullRequest
1646 голосов
/ 06 февраля 2009

Какая реальная (то есть практическая) разница существует между статическим классом и одноэлементным шаблоном?

Оба могут быть вызваны без создания экземпляров, оба предоставляют только один «Экземпляр», и ни один из них не является поточно-ориентированным. Есть ли другая разница?

Ответы [ 36 ]

1151 голосов
/ 06 февраля 2009

Что заставляет вас говорить, что одноэлементный или статический метод не является поточно-ориентированным? Обычно оба должны быть реализованы, чтобы быть потокобезопасными.

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

440 голосов
/ 06 февраля 2009

Правильный ответ - Джон Скит, на другом форуме здесь .

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

Статический класс допускает только статический методы.

342 голосов
/ 11 сентября 2012
  1. Объекты Singleton хранятся в Heap , но статические объекты хранятся в stack .
  2. Мы можем клонировать (если дизайнер не запретил это) объект-одиночка, но мы не можем клонировать объект статического класса. .
  3. Синглтон-классы следуют ООП (объектно-ориентированные принципы), статические классы - нет.
  4. Мы можем реализовать interface с классом Singleton, но статические методы класса (или, например, C # static class) не могут.
137 голосов
/ 06 февраля 2009

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

63 голосов
/ 30 декабря 2010

static классы не для чего-либо, что нуждается в состоянии. Это полезно для объединения нескольких функций, т.е. Math (или Utils в проектах). Так что имя класса просто дает нам подсказку, где мы можем найти функции и ничего более.

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

Мое правило выбора между static и singleton:

Если есть несколько функций, которые должны храниться вместе, тогда static - выбор. Все, что требует единого доступа к некоторым ресурсам, может быть реализовано как singleton.

55 голосов
/ 01 июня 2015

Статический класс: -

  1. Вы не можете создать экземпляр статического класса.

  2. Загружается автоматически общеязыковой средой (CLR) .NET Framework при загрузке программы или пространства имен, содержащих класс.

  3. Статический класс не может иметь конструктор.

  4. Мы не можем передать статический класс методу.

  5. Мы не можем наследовать статический класс от другого статического класса в C #.

  6. Класс, имеющий все статические методы.

  7. Лучшая производительность (статические методы связаны во время компиляции)

Singleton: -

  1. Вы можете создать один экземпляр объекта и использовать его повторно.

  2. Экземпляр синглтона создается впервые по запросу пользователя.

  3. Класс Singleton может иметь конструктор.

  4. Вы можете создать объект одноэлементного класса и передать его методу.

  5. Класс Singleton не говорит о каких-либо ограничениях наследования.

  6. Мы можем располагать объекты одноэлементного класса, но не статического класса.

  7. Методы могут быть переопределены.

  8. Может быть загружен в случае необходимости (статические классы загружаются всегда).

  9. Мы можем реализовать интерфейс (статический класс не может реализовать интерфейс).

49 голосов
/ 06 февраля 2009

Статический класс - это класс, в котором есть только статические методы, для которых более подходящим словом будут "функции". Стиль дизайна, воплощенный в статическом классе, является чисто процедурным.

Синглтон, с другой стороны, является шаблоном, характерным для ОО-дизайна. Это экземпляр объекта (со всеми присущими ему возможностями, такими как полиморфизм), с процедурой создания, которая гарантирует, что существует только один экземпляр этой конкретной роли за все время его жизни.

33 голосов
/ 06 февраля 2009

В шаблоне синглтона вы можете создать синглтон как экземпляр производного типа, вы не можете сделать это со статическим классом.

Быстрый пример:

if( useD3D )
    IRenderer::instance = new D3DRenderer
else
    IRenderer::instance = new OpenGLRenderer
24 голосов
/ 21 декабря 2012

Чтобы расширить на Ответ Джона Скита

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

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

21 голосов
/ 08 августа 2011

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

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