Страницы

Поиск по вопросам

среда, 17 октября 2018 г.

Singleton и static class

Вот решил посмотреть, что за чудо такое этот Singleton. И сразу возник вопрос: а чем он лучше статик класса? От статик класса объекты нельзя сделать, да и наследоваться от него тоже нельзя. И вообще какова область применения синглтона? В многопоточном приложении будут возникать проблемы при использовании статик класса?
Вот, к примеру два одинаковых класса, но реализованных в виде синглтона и статик:
public sealed class MyMathSingleton { private static readonly Object obj_lock = new Object(); private static MyMathSingleton instance = null;
private MyMathSingleton() { }
public static MyMathSingleton Instance { get { if (instance != null) return instance; Monitor.Enter(obj_lock); Interlocked.Exchange(ref instance, new MyMathSingleton()); Monitor.Exit(obj_lock); return instance; } }
public int A_plus_B(int a, int b) { return a + b; } }
public static class MyMathStatic { public static int A_plus_B(int a, int b) { return a + b; } }
PS. реализацию синглтона взял отсюда: Три возраста паттерна Singleton. Правда там автор пишет, что создание инстанса должно выглядеть так, иначе чуда не произойдет:
Singleton temp = new Singleton(); Interlocked.Exchange(ref instance, temp);
А у меня такая запись вполне нормально кушается компилятором:
Interlocked.Exchange(ref instance, new MyMathSingleton());

UPD 14.05.27
Допустим у меня в приложении есть форма, с помощью которой в одну из таблиц БД заносится новая запись или же запись редактируется. Эта форма мне нужна только одна, скажу больше - если их будет несколько, то могут возникнуть проблемы при редактировании записи. В данном случае целесообразно реализовать класс формы в виде синглтона?


Ответ

Он не лучше и не хуже статического класса, у них предназначение совершенно разное. Статический класс - это по сути пространство имен для функций/констант/etc. Синглтон - это сущность, которая может существовать в одном экземпляре. То есть как говорится, "все совпадения случайны". Задача синглтона - это гарантия существования только одного экземпляра с учетом многопоточности (без таковой он становится дыркой от бублика), тогда как статический класс по сути можно считать синтаксическим сахаром - C# полностью объектно-ориентирован, а потому наличие "самостоятельных" функций/переменных/констант, не заключенных в класс, в нем не допускается. Эту проблему достаточно элегантно решают статические классы. Ну а тот факт, что и для того и другого невозможно создание экземпляров (точнее, для синглтона возможно, но не напрямую) и от обоих нельзя наследоваться - это всего лишь похожие следствия из двух разных идей. Приведенный вами пример со статическим классом мягко говоря не в тему - он не предоставляет никакого экземпляра "в единственном числе", как раз-таки являясь "неймспейсом для функции". А потому отождествлять его с синглтоном некорректно - пропадает весь смысл идеи. Примерно то же самое можно сказать и про сам синглтон из вашего примера - вариант, предложенный Рихтером, вы дополнили ненужным методом A_plus_B (он не имеет отношения к самой идее и не влияет на "одиночность"). Собственно, еще стоит упомянуть, что синглтон, как паттерн проектирования - сущность не имеющая непосредственного отношения к конкретному языку, а статический класс - это всего лишь особенность ряда языков, в том числе и C#.

Комментариев нет:

Отправить комментарий