PDA

Просмотр полной версии : Паттерны Singleton VS static const


gyfak
22.12.2015, 17:44
Недавно мне был задан вопрос о различиях шаблона
Одиночки и статической константы (или переменной).

В сети толкового ответа найти не смог.
Есть пост на хабре http://habrahabr.ru/post/103681 ,
но там говорят о статическом классе и другом языке.

Дополнительный вопрос: если объект это набор процедур и свойств,
то не проще ли создавать статичные процедуры и свойства.

Самое обидное, я понимаю что Одиночка практичнее статичных методов,
но объяснить не могу.

Буду признателен за ответы или ссылки.

callme
22.12.2015, 19:03
Только синглтон может реализовывать интерфейс, наследовать класс.

Сам не пользуюсь ни синглтоном, ни статическими классами.

Если нужен глобальный доступ, кладу объект в глобальную переменную.

package
{
import flash.text.TextField;

public class Global
{
static public var textField:TextField;
}
}


package
{
import flash.display.Sprite;
import flash.text.TextField;

public class Main extends Sprite
{
public function Main()
{
Global.textField = new TextField();
}
}
}

GBee
22.12.2015, 19:08
ни статическими классами
А что такое статический класс?

package
{
import flash.text.TextField;

public class Global
{
static public var textField:TextField;
}
}
Уж не это ли он?

callme
22.12.2015, 19:23
GBee, тогда уж можно было зацепиться за "не пользуюсь". Ладно ни один не делаешь, но неужели прям ни одним не пользуешься? :)

А если по делу, то это единственный мой статический класс.

GBee
22.12.2015, 19:28
Ладно ни один не делаешь, но неужели прям ни одним не пользуешься?

Эээ? Я этого не говорил. Все утилиты - статические эээ классы :о) А синглтонов во флексе и так полно. Я на самом деле тоже эту тонкую грань между статиком и синглтоном понять не могу.

Добавлено через 2 минуты
На хабровой ссылке описаны какие то дохленькие различия на мой взгляд. А уж наследовать синглтон это я уже не понимаю вообще целей.

gyfak
22.12.2015, 19:31
Эм, я считал, что статических классов в as3 нет =( ну да ладно.

В том то и дилемма, одиночка нужен не для организации глобальной точки доступа, основная его задача - не дать создать больше одного экземпляра класса.

Т.е. данный шаблон расширяет собой статичный метод?

Добавлено через 2 минуты
Наследование как раз понятно - нужен тебе только один объект в игре, унаследовался от уже написанного класса и не замарачиваешься.

callme
22.12.2015, 19:39
GBee, сам синглтон тоже может наследоваться от другого класса.

gyfak, статических классов в as3 нет, флешеры просто так привыкли называть классы, которые состоят только/большей частью из статических членов.

gyfak
22.12.2015, 19:49
callme, ок, спасибо

Я так понял,

public static const myClass:Sprite = new myClass();

и

instance:myClass;

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

А так, одна и та же глобальная точка доступа к объекту.

caseyryan
22.12.2015, 19:52
только тем и отличаются, что в первом случае,
мы можем в любом месте создать еще один объект myClass,
а одиночка не даст нам этого сделать.

А так, одна и та же глобальная точка доступа к объекту.
Именно.
Но в ас3 полноценных синглтонов не может быть по простой причини отсутствия возможности создания приватных конструкторов.

callme
22.12.2015, 19:58
Да, так и есть. А если мне понадобится чтобы объект существовал только в единственном экземпляре, то я выберу вариант с синглтоном, нежели вариант со статическим классом. Потому что статические классы сложны для понимания. Они должны выступать каркасом для построения экземпляра. А тут получается, они и сами по себе объект, а еще и каркасом выступают, но никакие экземпляры не будут создаваться на самом деле. Мне такое тяжело понять.

gyfak
22.12.2015, 20:33
Всем спасибо.