Singleton
(单例)模式被熟知的原因是因为它限制了类的实例化次数。从经典意义上来说,Singleton
模式,在该实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例;如果实例已经存在,它会简单返回该对象的引用。
适用性
当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
该唯一的实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
Singleton
充当共享资源命名空间,从全局命名空间中隔离出代码实现,从而为函数提供单一访问点。
var Car = (function() {
var instance;
function init () {
// 定义私有变量
var num = Math.random()*1000;
// 定义私有函数
var year = function () {
return '2017'
};
return {
// 定义公有变量
color: 'red',
// 定义公有方法
logthis : function () {
console.log('这是第' + num + '辆' + this.color + '小汽车');
}
}
};
return {
getInstance: function () {
// 获取singleton的实例,如果存在就返回,不存在就创建新实例
if (!instance) {
instance = init();
}
return instance;
}
}
})()
var Car1 = (function () {
var instance;
function init () {
// 定义私有变量
var num = Math.random()*1000;
// 定义私有函数
var year = function () {
return '2017'
};
return {
// 定义公有变量
color: 'red',
// 定义公有方法
logthis : function () {
console.log('这是第' + num + '辆' + this.color + '小汽车');
}
}
}
return {
// 每次都创建新实例
getInstance: function () {
instance = init();
return instance;
}
}
})()
var singA = Car.getInstance().logthis(); //这是第830.7471063162537辆red小汽车
Car.getInstance().color = 'blue';
var singB = Car.getInstance().logthis(); //这是第830.7471063162537辆blud小汽车
var badsingA = Car1.getInstance().logthis(); //这是第346.70301464744324辆red小汽车
Car1.getInstance().color = 'blue';
var badsingB = Car1.getInstance().logthis(); //这是第584.6270761438335辆red小汽车