Flash gamedevСтатьи

Синглтоны во Flash (AS3)

Автор:

Иногда возникает необходимость наличия единственного экземпляра класса, особенно когда речь идет об использовании нескольких .swf файлов в одном.
Именно в такие моменты нас спасают синглтоны (Singletones).

Писал свой отладчик для флеша, написал свой класс Debugger, который должен был быть доступен в любом месте программы.
При этом экземпляр всегда должен был быть один. Ок, поступил я следующим образом:

package 
{
    class Debugger
    {
        static private var m_instance:Debugger = null;

        public function Debugger()
        {
            // тут делаем инициализацию
        }
        static public function get instance():Debugger
        {
            if(m_instance == null) 
                m_instance = new Debugger();

            return m_instance;
        }
        public function Trace(content:String):void
        {
             // тело функции
        }
    }
}

Теперь в любом месте программы я мог получить экземпляр класса и быть уверенным что он один  на всю флешку.
Например вот так:

Си стайл:

Debugger.instance.Trace("Hellow, World");

можно так:

var debugger:Debugger = Debugger.instance;
debugger.Trace("Hellow, World");

что тоже не комильфо.

Захотелось, чтобы можно было использовать так:

Debugger.Trace("Hellow, World");

Сказано - сделано:

package 
{
    class Debugger
    {
        static private var m_instance:Debugger = null;

        public function Debugger()
        {
            // тут делаем инициализацию
        }
        static public function instance():void
        {
            if(m_instance == null) 
                m_instance = new Debugger();
        }
        static public function Trace(content:String):void
        {
             instance();
             // тело функции
        }
    }
}

Готово. Теперь даже если в .swf, который мы подгрузим в основной .swf, будет использован наш класс, то мы будем уверенны, что его экземпляр будет общим на оба .swf.

P.S.
Все функции такого класса должны быть статик, как и поля класса, тогда мы можем удобно получить доступ к любой паблик функции и полю класса.

20 марта 2009

Комментарии [0]