单例模式:保证一个类仅有一个实例,并提供一个访问的全局访问点。
仅有一个实例对象
全局都可访问该实例
实现一个标准的单例模式其实就是用一个变量来表示是否已经为当前类创建过实例化对象,若创建过,在下次获取或创建实例时直接返回之前创建的实例化对象即可
。简单版 单例模式
var CreateStr = function (str) {
this.str = str;
this.instance = null;
};
CreateStr.prototype.getStr = function () {
console.log(this.str);
};
CreateStr.getInstance = function (str) {
if (!this.instance) {
this.instance = new CreateStr(str);
}
return this.instance;
};
var a = CreateStr.getInstance('s1');
var b = CreateStr.getInstance('s2');
console.log('a ------>', a); // CreateStr { name: 's1', instance: null }
console.log('b ------>', b); // CreateStr { name: 's1', instance: null }
a.getStr(); // s1
b.getStr(); // s1
console.log(a === b); // true
透明版 单例模式
var CreateStr = (function () {
var instance = null;
return function (str) {
if (instance) {
return instance;
}
this.str = str;
return (instance = this);
};
})();
CreateStr.prototype.getStr = function () {
console.log(this.str);
};
let a = new CreateStr('s1');
let b = new CreateStr('s2');
console.log('a ------>', a); // { str: 's1' }
console.log('b ------>', b); // { str: 's1' }
a.getStr(); // s1
b.getStr(); // s1
console.log(a === b); // true
代理版 单例模式
function CreateStr(str) {
this.str = str;
this.getStr();
}
CreateStr.prototype.getStr = function () {
console.log(this.str);
};
var ProxyObj = (function () {
var instance = null;
return function (str) {
if (!instance) {
instance = new CreateStr(str);
}
return instance;
};
})();
var a = new ProxyObj('s1');
var b = new ProxyObj('s2');
console.log('a ------>', a); // CreateStr { str: 's1' }
console.log('b ------>', b); // CreateStr { str: 's1' }
a.getStr(); // s1
b.getStr(); // s1
console.log('b ------>', a === b); // true
曾探
大佬的《JavaScript 设计模式与开发实践》。文章仅做个人学习总结和知识汇总•问题标注 Q:(question)
•答案标注 R:(result)
•注意事项标准:A:(attention matters)
•详情描述标注:D:(detail info)
•总结标注:S:(summary)
•分析标注:Ana:(analysis)
•提示标注:T:(tips)