реализация синглтон-класса для Actionscript - PullRequest
1 голос
/ 22 июля 2010

Я знаю, что actionscript не разрешает использовать закрытый consttructor в любое время, но если я хочу написать класс sinlgleton в сценарии действия, так как реализовать его в actioncript.

Может ли кто-нибудь привести пример синглтон-шаблона в actionscript?

Ответы [ 5 ]

8 голосов
/ 22 июля 2010

Я использую что-то вроде этого:

package singletons
{

    [Bindable]
    public class MySingleton
    {
        private static var _instance:MySingleton;

        public function MySingleton(e:Enforcer)  {
            if(e == null) {
                throw new Error("Hey!  You can't do that!  Call getInstance() instead!");
            }   
        }

        public static function getInstance():MySingleton {
            if(_instance == null) {
                _instance = new MySingleton (new Enforcer);
            }
            return _instance;
        }
    }
}

// an empty, private class, used to prevent outside sources from instantiating this locator
// directly, without using the getInstance() function....
class Enforcer{}
4 голосов
/ 22 июля 2010

Вам нужно слегка изменить ответ Alxx, так как это не мешает работе нового Singleton () ...

public class Singleton {
    private static var _instance : Singleton;

    public function Singleton( newBlocker : ClassLock ) {
    }

    public static function getInstance() : Singleton {
        if ( _instance == null ) {
            _instance = new Singleton( new ClassLock() );
        }
        return _instance;
    }
}
class ClassLock{}

Закрытый класс используется Singleton, чтобы другие классы просто не делали новый Singleton.() сначала, а затем получить второй экземпляр, выполнив getInstance ().

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

2 голосов
/ 22 июля 2010

в принципе, все ответы верны, ответы Рейда и Грегора обеспечивают большую безопасность времени компиляции. Полагаю, лучше всего объявить интерфейс для синглтона и частного разработчика, предоставляемый через статический класс:

package {
    interface IFoo {
        function foo():void;
    }
}

и затем:

package Foo {
    private static var _instance:IFoo;
    public static function getInstance():IFoo {
        if (_instance == null) _instance = new Impl();
        return _instance;
    }
}
class Impl implements IFoo {
    public function foo():void {
        trace("fooooooooooooooooooo");
    }
}

это не зависит от ошибок времени выполнения для безопасности. Кроме того, он снижает сцепление.

Greetz
back2dos

1 голос
/ 23 июля 2010

Я использую этот подход ...

package
{
    public class Main
    {
        private static var _instance:Main;
        private static var _singletonLock:Boolean = false;

        /**
         * Creates a new instance of the class.
         */
        public function Main()
        {
            if (!_singletonLock) throw new SingletonException(this);
        }

        /**
         * Returns the singleton instance of the class.
         */
        public static function get instance():Main
        {
            if (_instance == null)
            {
                _singletonLock = true;
                _instance = new Main();
                _singletonLock = false;
            }
            return _instance;
        }
    }
}

... не так кратко, как некоторые другие методы, но он абсолютно безопасен и не требует пустого класса уровня пакета.Также обратите внимание на ярлык с SingletonException, который является классом, который расширяет класс ошибок AS3 и сохраняет ввод некоторого кода при использовании более одного Singleton ...

package
{
    public class SingletonException extends Error
    {
        public function SingletonException(object:Object)
        {
            super("Tried to instantiate the singleton " + object + " through it's constructor."
                + " Use the 'instance' property to get an instance of this singleton.");
        }
    }
}
1 голос
/ 22 июля 2010
public class Singleton {
    private static var _instance:Singleton;

    public **static** function get instance():Singleton
    {
        if (_instance == null)
        {
             _instance = new Singleton();
        }
        return _instance;
    }

    public function Singleton()

    {
        if (_instance != null) throw new Error("You can't create Singleton twice!");
    }
}

Проверка во время выполнения при отсутствии частного конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...