单例模式 详解

定义

保证一个类仅有一个实例,并且提供一个访问它的全局访问点;
(在该实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例;如果实例已经存在,它会简单返回该对象的引用)

创建型模式


适用场景

  • 当类只有一个实例而且客户可以从一个众所周知的访问点访问它时;
  • 该唯一的实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时;

实现代码

var Singleton = (function () {
    //保持了Singleton的一个引用
    var instance;
    function init () {
        var privateRandomNum = Math.random();
        return {
            getRandomNum : function () {
                return privateRandomNum;
            }
        }
    };
    return {
        getInstance : function () {
            if (!instance)
                instance = init();
            return instance;
        }
    };

})();

var singleA = Singleton.getInstance();
var singleB = Singleton.getInstance();
console.log(singleA.getRandomNum() === singleB.getRandomNum());

var WRSingleton = (function () {
    var instance;
    function init () {
        var privateRandomNum = Math.random();
        return {
            getRandomNum : function () {
                return privateRandomNum;
            }
        }
    };
    return {
        getInstance : function () {
            instance = init();
            return instance;
        }
    };
})();

var wrsingleA = WRSingleton.getInstance();
var wrsingleB = WRSingleton.getInstance();
console.log(wrsingleA.getRandomNum() === wrsingleB.getRandomNum());

  • 其实两段代码的差别在于,前者获取对象的实例,如果存在就返回,不存在就创建实例;而后者每次都要创建新实例,不会判断实例已经创建;
  • init 中的是私有方法和变量,而 return 中的是公有方法和变量;
原文地址:https://www.cnblogs.com/George1994/p/6037641.html