下面这个单例模式有什么问题吗?

Is there something wrong with this following singleton pattern?

本文关键字:什么 问题 单例模式      更新时间:2023-09-26

我遇到了单例模式,理解如何实现它是相当棘手的,我知道有些人会建议在大多数时候避免它,所以下面是我发现很容易理解的特定单例变体,但不知怎么的,我觉得这不是这个模式的最佳实现,你们能建议这个模式更好的形式吗?

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'

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

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

单例不应该像你的代码那样使用构造函数,那是不必要的。如果你觉得需要为初始化传递参数,就不要让它成为单例