Каков наилучший способ реализации одноэлементного шаблона в Actionscript 3? - PullRequest
4 голосов
/ 25 сентября 2008

Поскольку AS3 не допускает частные конструкторы, кажется, что единственный способ создать синглтон и гарантировать, что конструктор не был явно создан с помощью «new», - это передать один параметр и проверить его.

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

Закрытый объект, переданный конструктору, кажется предпочтительным, но не похоже, что у вас может быть закрытый класс в том же пакете. Это правда? И что более важно, это лучший способ реализовать синглтон?

Ответы [ 4 ]

11 голосов
/ 25 сентября 2008

Небольшая адаптация ответа enobrev - иметь экземпляр в качестве добытчика. Некоторые скажут, что это более элегантно. Кроме того, ответ enobrev не будет применять Singleton, если вы вызовете конструктор перед вызовом getInstance. Это может быть не идеально, но я проверил это, и это работает. (Определенно, есть и другой хороший способ сделать это в книге «Advanced ActionScrpt3 с шаблонами проектирования»).

package {
    public class Singleton {

    private static var _instance:Singleton;

    public function Singleton(enforcer:SingletonEnforcer) {
        if( !enforcer) 
        {
                throw new Error( "Singleton and can only be accessed through Singleton.getInstance()" ); 
        }
    }

    public static function get instance():Singleton
    {
        if(!Singleton._instance)
        {
            Singleton._instance = new Singleton(new SingletonEnforcer());
        }

        return Singleton._instance;
    }
}

}
class SingletonEnforcer{}
5 голосов
/ 25 сентября 2008

Я использовал это в течение некоторого времени, которое, я думаю, я изначально получил из википедии всех мест.

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

        public function Singleton() {
            if( Singleton.instance ) {
                throw new Error( "Singleton and can only be accessed through Singleton.getInstance()" ); 
            }
        }

        public static function getInstance():Singleton {                
            return Singleton.instance;
        }
    }
}

Вот интересное резюме проблемы, которое приводит к аналогичному решению.

0 голосов
/ 25 сентября 2008

Вы можете получить приватный класс, например:

package some.pack
{
  public class Foo
  {
    public Foo(f : CheckFoo)
    {
      if (f == null) throw new Exception(...);
    }
  }

  static private inst : Foo;
  static public getInstance() : Foo
  {
     if (inst == null)
         inst = new Foo(new CheckFoo());
     return inst;
  }
}

class CheckFoo
{
}
0 голосов
/ 25 сентября 2008

Шаблон, который используется Cairngorm (который может быть не лучшим), должен генерировать исключение времени выполнения в конструкторе, если конструктор вызывается во второй раз. Например:

public class Foo {
  private static var instance : Foo;

  public Foo() {
    if( instance != null ) { 
      throw new Exception ("Singleton constructor called");
    }
    instance = this;
  }

  public static getInstance() : Foo {
    if( instance == null ) {
      instance = new Foo();
    }
    return instance;
  }

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