Преимущество класса Static перед использованием Singleton - PullRequest
8 голосов
/ 08 мая 2009

Дублирование

Что не так с синглтоном?
Одиночки: хороший дизайн или костыль?
Синглтон: как его использовать
Что плохого в синглетонах


Вы можете найти множество причин для использования Singleton над классом Static. Но обязательно должны быть ситуации, когда лучше использовать статический класс перед синглтоном. Что они?

Ответы [ 6 ]

9 голосов
/ 08 мая 2009

Вы можете использовать статический класс, когда:

1) все его методы являются утилитами (хороший пример - класс Math)

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

3) вы абсолютно уверены, что в будущем он не станет сохраняться с состоянием, и вы уверены, что вам всегда будет нужен только один экземпляр этого класса

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

5 голосов
/ 08 мая 2009

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

3 голосов
/ 08 мая 2009

Если в вашем классе нет состояний, используйте класс Static.

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

В противном случае используйте обычный класс.

2 голосов
/ 08 мая 2009

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

0 голосов
/ 05 апреля 2011

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

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

С другой стороны, если в функционале, которого вы пытаетесь достичь, присутствует какое-то состояние, то, вероятно, лучше использовать Singleton. Объект Singleton может содержать / управлять своим состоянием и управлять параллельным доступом / многопоточностью, тогда как это становится намного сложнее со статическими классами и статическими методами. Если вы используете Singleton в C #, я настоятельно рекомендую прочитать статью Джона Скита о правильной реализации Singleton, которая доступна по адресу http://www.yoda.arachsys.com/csharp/singleton.html.

Синглтоны более сопоставимы со статическими классами, чем статические методы. Большим преимуществом синглетонов в этом сравнении является то, что они могут реализовывать интерфейсы и наследовать от базовых классов. Это позволяет вам отделить их реализации от их интерфейсов. Например, если у меня есть интерфейс IAccountService в моей базовой сборке с реализацией Singleton, SingletonAspNetAccountService на моем сервисном уровне, то я могу внедрить IAccountService в свой пользовательский интерфейс с контейнером IoC, не требуя зависимости от мой уровень обслуживания на уровне пользовательского интерфейса. С другой стороны, если бы у меня был статический класс Accounts, мне пришлось бы либо создать адаптер для методов статического класса, либо иметь зависимость от уровня обслуживания в моем пользовательском интерфейсе, чтобы получить доступ к функциональности статической учетной записи.

0 голосов
/ 08 мая 2009

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

Помните, что каждый экземпляр Class является одиночным, управляемым JVM. Так что статический класс - это одиночка.

...