|
30.09.2011, 22:23
|
#1
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
singleton vs static
Чем singleton лучше статичного класса (т.е. у которого все методы и переменные static)?
|
(Offline)
|
|
30.09.2011, 22:40
|
#2
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: singleton vs static
Две разные вещи, по разному используются.
Имхо, их сравнивать нельзя никак. Тот же синглтон - имеет статик переменную в себе, но указывает на дин объект, который при обращении инициализируется.
В статик полностью же объекте, инициализацию делать геморнее - нужен вызов функции инициализации вручную. Но не в этом суть.
То же "вкл/выкл" делать для статик класса проще, с больше экономией памяти и более удобным использованием, чем для синглтона.
Зависит от ситуации, и где и для чего нужно заюзать.
|
(Offline)
|
|
30.09.2011, 23:25
|
#3
|
Дэвелопер
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений (для 2,419 пользователей)
|
Ответ: singleton vs static
Ну допустим есть класс MyCl
Если он синглетон:
//1 кусок кода MyCl *m = MyCl::init(); m->someFuncA(); delete m; //2 кусок кода MyCl *m = MyCl::init(); m->someFuncB(); delete m;
если же он статичный класс то:
//1 кусок кода MyCl::someFuncA(); //2 кусок кода MyCl::someFuncB();
Помойму второй пример удобней и понятней.
Но многие почемуто используют первый.
|
(Offline)
|
|
30.09.2011, 23:28
|
#4
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: singleton vs static
delete - удаляет объект, или указатель? Если объект - то это не разумно имхо. Суть такого синглтона, это инициализация лишь для совершения определённых действий, и затем разрушение. Имхо, весьма извратный подход, и не удобный.
Я просто на C# сижу.
Второй вариант, естественно проще. Но учитывай разницу, что в первом у тебя в памяти не будет постоянно висеть объект, а во втором варианте будет, и нужно будет вызвать либо Initialize, либо делать то же самое что в первом варианте, только уже в теле статических функций.
Что технически будет то же самое что и первый вариант, только с одним минусом - каждый вызов будет пересоздавать объект, что не позволяет делать последовательного вызова функций с одним созданием и удалением.
Но юзабилити имхо лучше у второго варианта.
|
(Offline)
|
|
01.10.2011, 00:20
|
#5
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: singleton vs static
//1 кусок кода
MyCl *m = MyCl::init();
m->someFuncA();
delete m;
//2 кусок кода
MyCl *m = MyCl::init();
m->someFuncB();
delete m;
|
зачем delete? суть синглтона - объект класса в единственном уникальном экземпляре будет доступным в разное время в разных участках кода. delete нужен только на выходе из программы уже.
Помойму второй пример удобней и понятней.
|
в твоём случае да.
а в таком нет:
статик:
class myClass
{
static float a,b,c;
public:
static void do();
};
float myClass::a = 0; // неявный момент назначения статик переменных (может вызваться в рандомной последовательности относительно инициализации данных других классов)
float myClass::b = 0;
float myClass::c = 0;
void myClass::do()
{
a = b+c;
}
синглтон:
class myClass
{
float a,b,c;
static myClass* instance;
public:
static myClass* Instance()
{
if (!instance) instance = new myClass();
return instance;
}
static void Release()
{
if (instance) delete instance;
}
void do();
};
myClass* myClass::instance = 0; //единственная инициализация статик данных для синглтон класса. остальные нормальные будут сидеть внутри объекта класса
void myClass::do()
{
a=b+c;
}
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.10.2011, 01:02
|
#6
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: singleton vs static
А так нельзя?
class myClass
{
static float a = 0;
static float b = 0;
static float c = 0;
public:
static void do();
};
void myClass::do()
{
a = b+c;
}
В C# можно если что..
|
(Offline)
|
|
01.10.2011, 01:09
|
#7
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: singleton vs static
даже так уже менее удобно, чем синглтоном, по крайней мере если переменных много.
ну и потом - нельзя
error C2864: 'a' : only const static integral data members can be initialized inside a class or struct
|
|
(Offline)
|
|
01.10.2011, 01:19
|
#8
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: singleton vs static
Ех, вот жеж неудобства с С++.
В C#, это выглядит так.
static:
class MyClass {
private static float a, b, c;
public static void Do() {
a = b + c;
}
}
...
MyClass.Do();
singleton:
class MyClass {
private float a, b, c;
private static MyClass instance;
private MyClass() { }
public static MyClass Instance {
get {
if (instance == null) {
instance = new MyClass();
}
return instance;
}
}
public void Do() {
this.a = this.b + this.c;
}
}
...
MyClass.Instance.Do();
Судите сами, но реальная необходимость в singleton'е, очень мало вероятна имхо.
Но конечно, многим религия не позволяет юзать static'и..
Кстати, Den, зачем ссылку удалил?
http://habrahabr.ru/blogs/refactoring/103681/
Тут отлично описываются разница их. И кстати да, много отличным поинтов подмечено.
Но суть больше в том что люди начинают сравнивать singleton'ы как альтернатива static'ам, но это не так, т.к. это две схожие но различные сущности. Singleton хорош в виде объекта, для расширения, наследия и т.п. Но если это не нужно, так зачем клепать ещё?
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:41.
|