Синглтонные реализации AS3

Я видел так много реализаций синглетонов вокруг, и я просто хочу синглтон, который

1.- экземпляры по первому вызову 2.- экземпляры только один раз (дух)

Так что по производительности и низкому потреблению памяти, что является лучшей реализацией для этого?

Пример 1

package Singletons
{
    public class someClass
    {
        private static var _instance:someClass;

        public function AlertIcons(e:Blocker):void{}

        public static function get instance():someClass{
            test!=null || (test=new someClass(new Blocker()));
            return _instance;
        }
    }
}
class Blocker{}

Example2

public final class Singleton
{
    private static var _instance:Singleton = new Singleton();

    public function Singleton()
    {
        if (_instance != null)
        {
            throw new Error("Singleton can only be accessed through Singleton.instance");
        }
    }

    public static function get instance():Singleton
    {
        return _instance;
    }
}

Пример 3

package {

    public class SingletonDemo {
        private static var instance:SingletonDemo;
        private static var allowInstantiation:Boolean;

        public static function getInstance():SingletonDemo {
            if (instance == null) {
                allowInstantiation = true;
                instance = new SingletonDemo();
                allowInstantiation = false;
            }
            return instance;
        }

        public function SingletonDemo():void {
            if (!allowInstantiation) {
                 throw new Error("Error: Instantiation failed: Use SingletonDemo.getInstance() instead of new.");
            }
        }
    }
}
 Jason Reeves10 нояб. 2012 г., 04:23
пример 2 это путь

Ответы на вопрос(1)

Решение Вопроса

но с изюминкой, поскольку вы должны разрешить вызывать новый Singleton () хотя бы один раз, и я неЯ не люблю создавать экземпляры, пока они мне не нужны, поэтому первый вызов instance () фактически создает экземпляр ... последующие вызовы захватывают оригинал.

РЕДАКТИРОВАТЬ: посеял, как это может позволить, если вы звоните

var singleton:Singleton = new Singleton();

это будет работать ... но все будущие попытки приведут к ошибке и принудительному использованию метода getInstance ()

public final class Singleton{
    private static var _instance:Singleton;

    public function Singleton(){
        if(_instance){
            throw new Error("Singleton... use getInstance()");
        } 
        _instance = this;
    }

    public static function getInstance():Singleton{
        if(!_instance){
            new Singleton();
        } 
        return _instance;
    }
}
 Ziul10 нояб. 2012 г., 17:41
хорошо, все выглядит довольно хорошо, но что за $ _instance = this; $ для?
 Ziul10 нояб. 2012 г., 18:03
но немы получаем то же самое поведение без этой линии? только что созданный экземпляр первый раз, потом ошибка на будущее?
 Jason Reeves10 нояб. 2012 г., 18:13
это тот же чистый результат, что и в примере два, который вы дали, он просто неСоздайте первый экземпляр Singleton, пока он не будет запрошен впервые.
 Jason Reeves10 нояб. 2012 г., 20:32
нет ... но такой способ кодирования просто ОБЕСПЕЧИВАЕТ 100%, если кто-то отстает от вас через 6 месяцев (или вы, если вы забудете :)) и попытаетесь вызвать новые функции Singleton () или getInstance (), они не могут сломать ваш код в любом случае. ... это всегда заставляет синглтон, что бы ни пытались.
 Ziul10 нояб. 2012 г., 18:40
о, тыПравильно, я действительно не уделял внимания оценке: if (_instance). Теперь последний вопрос: хорошо ли разрешить myvar: Singleton = new Singleton () вызываться один раз (перед getInstance) ?.
 Jason Reeves10 нояб. 2012 г., 18:08
если вы вызываете myvar: Singleton = new Singleton () ... без _instance = this в конструкторе ... вы можете вызывать его снова и снова без ошибок. Однако, если вы полагаетесь на getInstance () и меняете новый Singlton () в этом методе, чтобы сказать _instance = new Singleton () ..., тогда getInstance будет работать отлично ... но вызовы напрямую к var = new Singleton () во всем приложении будут не выбрасывать ошибки, пока getInstance не будет вызван хотя бы один раз. Метод, который я показал вам, защищает как getInstance (), так и новый Singleton () от создания второго экземпляра.
 Jason Reeves10 нояб. 2012 г., 17:48
если при вызове конструктора _instance все еще равен нулю, конструктор завершает работу и устанавливает класс var _instance для только что созданного экземпляра (this), который он только что создал. Если вы снова вызовете new Singleton (), он выдаст ошибку.

Ваш ответ на вопрос