定义
保证一个类仅有一个实例,并且提供一个访问它的全局访问点;
(在该实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例;如果实例已经存在,它会简单返回该对象的引用)
创建型模式
适用场景
- 当类只有一个实例而且客户可以从一个众所周知的访问点访问它时;
- 该唯一的实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时;
实现代码
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 中的是公有方法和变量;