Question

Etant donné qu'AS3 n'autorise pas les constructeurs privés, il semble être le seul moyen de construire un singleton et garantit que le constructeur n'est pas explicitement créé via "& new". est de passer un seul paramètre et de le vérifier.

J'ai entendu deux recommandations, l'une consistant à vérifier l'appelant et à s'assurer qu'il s'agit bien de getInstance () statique, et l'autre à disposer d'une classe privée / interne dans le même espace de nom de package.

L'objet privé transmis au constructeur semble préférable, mais il ne semble pas que vous puissiez avoir une classe privée dans le même package. Est-ce vrai? Et plus important encore, est-ce la meilleure façon de mettre en œuvre un singleton?

Était-ce utile?

La solution

Une légère adaptation de la réponse d’enobrev est d’avoir l’instance comme getter. Certains diraient que c'est plus élégant. De plus, la réponse enobrev n'appliquera pas un Singleton si vous appelez le constructeur avant d'appeler getInstance. Cela peut ne pas être parfait, mais j'ai testé cela et cela fonctionne. (Il existe également un autre moyen intéressant de le faire dans le livre "Advanced ActionScrpt3 with Design Patterns" également).

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{}

Autres conseils

Je l'utilise depuis un certain temps, ce qui, je pense, provient à l'origine de wikipedia, peu importe le lieu.

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;
        }
    }
}

Voici un résumé intéressant du problème, qui conduit à une solution similaire.

Vous pouvez obtenir un cours privé comme celui-ci:

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
{
}

Le modèle utilisé par Cairngorm (qui peut ne pas être le meilleur) consiste à lancer une exception d'exécution dans le constructeur si celui-ci est appelé une seconde fois. Par exemple:

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;
  }

}    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top