以下单身模式是否有问题?

时间:2016-09-23 06:12:22

标签: javascript singleton

我遇到单身模式,了解如何实现它非常棘手,我知道有些人建议大多数时候都避免使用它,所以下面是特定的单例变体,我觉得很容易理解,但不知怎的,我觉得这不是这种模式的最佳实现,你们能不能提出更好的形式。



var Foo = (function () {
   
    var instance;
    var _priVar = 2;
    var log = function() {
      console.log("Hello");
    };
  
    function Singleton(x, y) {
        if (instance) {
            return instance;
        }
        
        this.name = x;
        this.age = y + _priVar;
        this.log = log;
      
        instance = this;
    }
    Singleton.getInstance = function () {
        return instance || new Singleton();
    }
    return Singleton;
}());




我的目标是当我们关注

var a = new Foo("Bob", 24); var b = new Foo(); var c = Foo(); var d = Foo.getInstance();

我们仍然会

 a == b // true
 a == c // true
 a == d // true
 a.name // 'Bob'
 b.age // 26
 c.log // 'Hello'
 d.name // 'Bob'

1 个答案:

答案 0 :(得分:1)

最简单的单例,也称为模块模式,由对象文字组成:

var foo = (function () {
    var x = "Bob",
        y = 24,
        _priVar = 2;

    function log() {
        console.log("Hello");
    }

    return {
        name: x,
        age: y + _priVar,
        log: log
    };
}());

如果你想引入延迟初始化,你可以使用额外的getInstance函数,就像你的实现一样:

var getFoo = (function () {
    var instance = null;
    return function getFooInstance() {
        if (instance) return instance;

        var x = "Bob",
            y = 24,
            _priVar = 2;

        function log() {
            console.log("Hello");
        }

        return instance = {
            name: x,
            age: y + _priVar,
            log: log
        };
    };
}());

单身人士不应该像你的代码那样使用构造函数,这是不必要的。如果您觉得需要传递参数进行初始化,不要使其成为单身