js设计模式-单例模式
什么是单例模式?简单的来说就是这个类的实例就只有一个,在简单点说的话:
假设 有一个类叫 CreateClass 当每次使用new操作符 去new它(CreateClass)时得到实例都是同一个实例;
function Single (name){
this.name = name;
};
Single.prototype.getName = function(){
console.log(this.name)
};
Single.getInstance = (function(){
let instance = null;
return function(name){
if(instance){
return instance;
}else{
return new Single(name)
}
};
})()
var s1 = Single.getInstance();
var s2 = Single.getInstance();
console.log(s1 === s2); // true
上述就是一个简单的单例模式,但是上述单例有个问题就是我创建实例不是用new关键字了而是用getInstance方法进行创建 但其他人使用时必须知道Single是个单例模式创建实例必须用Single.getInstance方法创建;
1.透明单例模式
let Single = (function(){
let instance = null;
let Instance = function (name) {
if (instance) {
return instance ;
} else {
this.name = name;
return (instance = this);
}
}
Instance.prototype.getName=function () {
console.log(this.name);
}
return Instance;
})();
let single1 = new Single('aaa');
let single2 = new Single('aaa');
single1.getName();
console.log(single1 === single2);
这样就可以直接new来产生实例了,但是上述方法违反了设计模式的单一职责的原则。
let Instance = function (name) {
this.name = name;
};
Instance.prototype.getName = function () {
console.log(this.name);
};
let Single = (function(){
let instance = null;
return function(name){
if(!instance){
instance = new Instance(name);
}
return instance;
};
})();
let single1 = new Single('aaa');
let single2 = new Single('aaa');
single1.getName();
console.log(single1 === single2);
这样就将构造函数抽离出来了,但是Single中把new Instance(name);写死了当我有其他的单例要产生是怎么办。
function Instance(name) {
this.name = name;
}
Instance.prototype.getName = function () {
console.log(this.name);
}
let createSingle = function (Constructor) {
let instance;
let SingleConstructor = function () {
if (!instance) {
instance = new Constructor(...arguments);
}
return instance;
}
return SingleConstructor;
};
let A = createSingle(Instance);
let a1 = new A('1111')
let a2 = new A('1111');
a1.getName();
console.log(a1 === a2);
这样就可以创建多个不同类型的单例了。