6

在阅读了很多关于单例模式的文章并进行了一些测试后,我发现像这样的单例模式没有区别(http://jsfiddle.net/bhsQC/1/):

var TheObject = function () {
    var instance;

    function init() {
        var that = this;
        var foo = 1;

        function consoleIt() {
            console.log(that, foo);
        }
        return {
            bar: function () {
                consoleIt()
            }
        };
    }
    return {
        getInstance: function () {
            if (!instance) {
                instance = init();
            }
            return instance;
        }
    };
}();
var myObject = TheObject.getInstance();
myObject.bar();

和这样的代码(http://jsfiddle.net/9Qa9H/3/):

var myObject = function () {
    var that = this;
    var foo = 1;

    function consoleIt() {
        console.log(that, foo);
    }
    return {
        bar: function () {
            consoleIt();
        }
    };
}();
myObject.bar();

它们都只创建对象的一个​​实例,它们都可以拥有“私有”成员,that指向window它们中的任何一个中的对象。只是后者更简单。如果我错了,请纠正我。

使用这样的标准构造函数(http://jsfiddle.net/vnpR7/2/):

var TheObject = function () {
    var that = this;
    var foo = 1;

    function consoleIt() {
        console.log(that, foo);
    }
    return {
        bar: function () {
            consoleIt();
        }
    };
};
var myObject = new TheObject();
myObject.bar();

具有正确使用 的优点that,但不是单例。

我的问题是:这三种方法的总体优缺点是什么?(如果重要的话,我正在使用 Dojo 1.9 开发一个 Web 应用程序,所以无论哪种方式,这个对象都将在 Dojo 的内部require)。

4

3 回答 3

3

好吧,真正的区别在于单例的构建时间。第二种方法立即创建单例,第一种方法仅在第一次调用之后。根据单例在内存中的需求,这可能会对您的应用程序产生影响。例如,您可能仅在用户执行特定操作时才需要单例。因此,如果用户不这样做,那么根本不必初始化单例就好了。

此外,如果单例的初始化计算量很大,那么能够将其推迟到您真正需要单例时是一件好事。

编辑:正如贾尼所说,最后一个不是单身人士,所以我没有讨论它。

于 2013-05-21T13:24:51.273 回答
1

我认为前两者之间并没有太大的实际区别。

第一个getInstance在 Java 等经典 OOP 语言中表现得更像单例模式。

第二种方法的行为更像是经典 OOP 语言中的静态类。

显然,这两个问题都与所有单身人士的问题相同(如果你在谷歌上查找的话,有很多材料)。

最后一种方法甚至没有真正使用new- 您正在从“构造函数”返回一个对象。显然,这根本不是单例,因此,将是首选方法。

于 2013-05-21T12:55:43.840 回答
0

我喜欢像这样构建单身人士:

function FriendHandler(){ 
    if(FriendHandler.prototype.singleton){ 
        return FriendHandler.prototype.singleton; 
    }

    if(!(this instanceOf FriendHandler)){
        return new FriendHandler();
    }

    FriendHandler.prototype.singleton = this;
 ...
    this.selectFriends = function(firstName){
        ...
    };
}

如果你这样做:

new FriendHandler()
or
FriendHandler()

它总是返回相同的实例。

几个月前我写过它:http: //franciscomsferreira.blogspot.com/2013/01/how-to-write-maintainable-javascript-or.html

于 2013-05-21T15:35:08.880 回答