单例模式
概念
单例模式是指在内存中只创立一次对象的设计模式。在程序中屡次应用同一个对象且作用雷同时,为了避免频繁地创建对象使得内存占用,单例模式能够让程序仅在内存中创立一个对象,让所有须要调用的中央都共享这一单例对象。
长处
适宜于繁多对象,只生成一个对象实例,防止频繁创立和销毁实例,缩小栈内存占用。
只有一个实例且全局可拜访该实例,便于保护一个全局实例对象
毛病
不实用动静扩大对象、创立多个类似对象的场景
代码实现
let A = function (name) { this.name = name this.ins = null}A.getName = function (name) { return new A(name)}A.toNum = function (age) {if(!isNaN(age)) { return Number(age)} else { return '未知年龄'}}// 实例控制器A.insHandle = function (str) { if(this.ins) { //外围点 只容许有一个实例 return this.ins } return this.ins = new A(str)}console.log(A.getName('张三').name, A.toNum(44), A.insHandle('这是一个实例').name) // 张三 44 这是一个实例
定义A函数, A为一个实例。因而咱们能够在函数 A 中定义一个 insHandle() 办法来管控这个单例,
并创立返回类实例对象,而不是通过传统的 new 操作符来创立类实例对象。
this.ins 存储创立的实例对象,每次接管到创立实例对象时,判断 this.ins 是否有实例对象,有则返回,没有则创立并更新 this.ins 值,因而无论调用多少次 insHandle(),最终都只会返回同一个 A 类实例对象(return this.ins = new A(str))。
然而 这种治理单例的操作,与对象创立的操作,性能代码耦合在一起,不合乎 “繁多职责准则”,无奈应用 new
来进行类实例化,需束缚该类实例化的调用形式
咱们就这一点 对他进行优化改良
let A = (function(){ let ins; return function(name, age, msg) { if (ins) { //外围点 只容许有一个实例 return ins; } this.name = name; this.age = age; this.msg = msg; return ins = this; }})(); A.prototype.getMsg = function() { return `${ this.name } ${ this.age } ${ this.msg }` }let zs = new A('张三', 44, '这是一个实例')let ls = new A('李四', 32, '这是一个实例')console.log(zs === ls); trueconsole.log(ls.getMsg()); // 张三 44 这是一个实例console.log(zs.getMsg()); // 张三 44 这是一个实例