Каков наилучший способ реализовать класс singleton pattern в Actionscript 3?
-
02-07-2019 - |
Вопрос
Поскольку AS3 не допускает частных конструкторов, кажется, единственный способ создать синглтон и гарантировать, что конструктор явно не создан с помощью "new", - это передать один параметр и проверить его.
Я слышал две рекомендации: одна - проверить вызывающий объект и убедиться, что это статический getInstance(), а другая - иметь частный / внутренний класс в том же пространстве имен пакета.
Закрытый объект, передаваемый в конструкторе, кажется предпочтительнее, но не похоже, что у вас может быть закрытый класс в том же пакете.Это правда?И что еще более важно, является ли это лучшим способом реализации синглтона?
Решение
Небольшая адаптация ответа enobrev заключается в том, чтобы использовать instance в качестве средства получения.Кто-то сказал бы, что это более элегантно.Кроме того, ответ enobrev не будет принудительно использовать Singleton, если вы вызовете конструктор перед вызовом getInstance.Возможно, это не идеально, но я протестировал это, и это работает.(Определенно, есть еще один хороший способ сделать это в книге "Advanced ActionScrpt3 with Design Patterns").
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{}
Другие советы
Я использую это в течение некоторого времени, которое, как мне кажется, я изначально почерпнул из википедии.
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;
}
}
}
Вот интересное резюме проблемы, которая приводит к аналогичному решению.
Вы можете получить частный класс следующим образом:
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
{
}
Шаблон, который используется 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;
}
}