设计模式-单例模式
(几个例子很简单的,20分钟速通,快一点的10分钟
定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点
思考?!
假如有个东西,每次都需要反复创建销毁,这会不会浪费资源,有必要每次都新建吗(单例模式的诞生
下面用三个例子尝试瞎写单例模式
第一种
/** 符合单例模式,但是不符合开闭原则,因为instance暴露了**/
function Test(name) {
// 1.正常new走的逻辑
// var this =Object.create(Test.prototype)
// return this
//2.单例模式
if (Test.instance) {
// 返回了对象就不返回this了
return Test.instance;
}
this.name = name;
Test.instance = this;
}
var a = new Test("one");
// 暴露了修改了就是false了 不符合开闭原则
// Test.instance={}
var b = new Test();
console.log(a === b);
第二种 利用闭包
function Test(name) {
var instance = this;
this.name = name;
Test = function () {
return instance;
};
}
var a = new Test();
// 这里都是给闭包的那个Test原型上加属性,但是我们new 的时候都是new 外面的那个Test
Test.prototype.lastName = "马龙";
var b = new Test();
var c = new Test();
console.log(b.lastName); // undefined
console.log(c.lastName);// undefined
console.log(a.lastName);// undefined
console.log(a === b, b === c);
第三种 也叫圣杯模式
1.跟第一种做对比,利用了闭包,符合开闭原则
2.跟第二种做对比,利用的是里面的函数作为构造函数
var Test = (function () {
var instance;
return function (name) {
if (typeof instance === "object") {
return instances;
}
instance = this;
this.name = name;
};
})();
最后,浓缩精华,尝试写一个让方法能改变其成为单例模式
var getSingle = function (func) {
var result;
return function () {
if (!result) {
result = func.apply(this, arguments);
}
return result;
};
};
// 心里活动:perfect,也不是多难嘛