Синглтон классы - PullRequest
       14

Синглтон классы

8 голосов
/ 15 декабря 2010

Есть ли какая-либо разница между классом Singleton и классом со всеми статическими членами (т. Е. Методами и атрибутами).

Я не смог найти ни одного случая, когда «весь класс статических членов» не достиг бы той же функциональностикак класс, правильно реализующий шаблон Singleton?

Например.java.lang.Runtime - это правильный класс Singleton, тогда как java.lang.System имеет все статические методы для доступа и просто имеет приватный конструктор, чтобы избежать внешнего конструирования.Кто-нибудь знает, почему классы типа Runtime сделаны Singleton и не реализованы как java.lang.System.

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

Ответы [ 8 ]

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

Да, есть разница - синглтон может реализовывать интерфейс.

Кроме того, то, что выглядит как синглтон снаружи, на самом деле может быть реализовано через разные классы, где синглтонный доступМетод (например, Runtime.getRuntime()) может создать правильный экземпляр во время выполнения.Я не говорю, что это здесь произошло, но это вариант.

3 голосов
/ 15 декабря 2010

Ну, вы можете сериализовать и десериализовать объект (и, следовательно, Singleton), используя интерфейс Serializable (на Java), но не статический класс.

1 голос
/ 15 декабря 2010

Один экземпляр создается один раз.

Статический класс никогда не создается.

0 голосов
/ 15 декабря 2010

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

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

0 голосов
/ 15 декабря 2010

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

0 голосов
/ 15 декабря 2010

Я думаю, вы должны спросить, что отличается между финальным классом с приватным конструктором и статическим классом.Потому что синглтон - это класс, и реализация зависит от программиста, который программирует этот класс.Это то же самое, что спросить, в чем разница между объектом и статическим классом.

0 голосов
/ 15 декабря 2010

Я считаю, что нет никакой разницы между тем, что вы называете синглтоном и классом со всеми статическими методами / членами в принципе. Фактически, я думаю, что создание класса со всеми статическими членами - это способ реализации одноэлементной идиомы. Ну, может быть, в Java есть какая-то серьезная разница, но я говорю с точки зрения C ++.

0 голосов
/ 15 декабря 2010

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

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