Selon la spécification du pattern, un Singleton ne devrait pas pouvoir s'instancier via son constructeur, malheureusement l'AS3 ne nous permet pas de déclarer un constructeur comme membre privé. Pour contourner ce problème, en suivant l'exemple préconisé par virtual-industry.com, nous pouvons vérifier au runtime que notre singleton n'est pas instancié par lui même.

package adjust.utils {

        import flash.utils.getQualifiedClassName;

        dynamic public class Registry {
                private static var INSTANCE:Registry = null;
                private static var ALLOW_INSTANTIATION:Boolean = false;

                public function Registry() {
                        if (getQualifiedClassName(super) == "adjust.utils::Registry" ) {
                                if (!ALLOW_INSTANTIATION) {
                                        throw new Error("Error: Registry is a Singleton. Use Registry.getInstance()");
                                }
                        }
                }

                public static function getInstance():Registry {
                        if (INSTANCE == null) {
                                ALLOW_INSTANTIATION = true;
                                INSTANCE = new Registry();
                                ALLOW_INSTANTIATION = false;
                        } return INSTANCE;
                }
        }
}

Nous pouvons désormais depuis une classe A stocker une information dans le Registre :

package{
        import adjust.utils.Registry;
        public class A(){
                public function A(){
                        var reg:Registry = Registry.getInstance();
                        reg.hello = "world";
                }
        }
}

Et la récupérer sans problème dans une classe B

package{
        import adjust.utils.Registry;
        public class B(){
                public function B(){
                        var reg:Registry = Registry.getInstance();
                        trace(reg.hello) // world
                }
        }
}

C'est beau comme une chanson de Morrissey :note: