97 votes

JavaScript : best pattern Singleton

Double Possible:
La plus simple/la meilleure façon de mettre en œuvre singleton en JavaScript?

Je suis en utilisant ce modèle pour les singletons, dans l'exemple, le singleton est PlanetEarth:

var NAMESPACE = function () {

    var privateFunction1 = function () {
        privateFunction2();
    };

    var privateFunction2 = function () {
        alert('I\'m private!');
    };

    var Constructors = {};

    Constructors.PlanetEarth = function () {
        privateFunction1();
        privateFunction2();
    };

    Constructors.PlanetEarth.prototype = {
        someMethod: function () {
            if (console && console.log) {
                console.log('some method');             
            }
        }
    };

    Constructors.Person = function (name, address) {
        this.name = name;
        this.address = address;
    };

    Constructors.Person.prototype = {
        walk: function () {
            alert('STOMP!');
        }
    };

    return {
        Person: Constructors.Person, // there can be many
        PlanetEarth: new Constructors.PlanetEarth() // there can only be one!
    };

}();

Depuis PlanetEarth'constructeur reste privé, il ne peut en être un.

Maintenant, quelque chose me dit que cette auto-cuit chose n'est pas le mieux qu'on puisse faire, surtout parce que je n'ai pas une formation académique, j'ai tendance à résoudre des problèmes dans la stupide façons. Que proposeriez-vous comme une meilleure alternative à ma méthode, où le mieux est défini comme stylistiquement mieux et/ou plus puissant?

Merci

175voto

Tom Roggero Points 2581

ÇA POURRAIT ÊTRE GÉNIAL SI DOWNVOTERS COMMENTAIRE !

Meilleure solution trouvée : http://code.google.com/p/jslibs/wiki/JavascriptTips#Singleton_pattern

Pour ceux qui veulent la version stricte :

24voto

bobince Points 270740

Pourquoi utiliser un constructeur et le prototypage rapide pour un seul objet ?

Ce qui précède équivaut à :

18voto

arunpon Points 347

Extending le post ci-dessus par Tom, si vous avez besoin d’une déclaration de type de classe et accédez à l’instance de singleton en utilisant une variable, le code ci-dessous pourrait être utile. J’aime cette notation car le code est petit moi guidant.

Pour accéder le singleton, vous le feriez

1voto

Alain Lecluse Points 59
function SingletonClass() 
{
    // demo variable
    var names = [];

    // instance of the singleton
    this.singletonInstance = null;

    // Get the instance of the SingletonClass
    // If there is no instance in this.singletonInstance, instanciate one
    var getInstance = function() {
        if (!this.singletonInstance) {
            // create a instance
            this.singletonInstance = createInstance();
        }

        // return the instance of the singletonClass
        return this.singletonInstance;
    }

    // function for the creation of the SingletonClass class
    var createInstance = function() {

        // public methodes
        return {
            add : function(name) {
                names.push(name);
            },
            names : function() {
                return names;
            }
        }
    }

    // wen constructed the getInstance is automaticly called and return the SingletonClass instance 
    return getInstance();
}

var obj1 = new SingletonClass();
obj1.add("Jim");
console.log(obj1.names());
// prints: ["Jim"]

var obj2 = new SingletonClass();
obj2.add("Ralph");
console.log(obj1.names());
// Ralph is added to the singleton instance and there for also acceseble by obj1
// prints: ["Jim", "Ralph"]
console.log(obj2.names());
// prints: ["Jim", "Ralph"]

obj1.add("Bart");
console.log(obj2.names());
// prints: ["Jim", "Ralph", "Bart"]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X