Вот решил посмотреть, что за чудо такое этот 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#.
Комментариев нет:
Отправить комментарий