我爱设计模式-单例模式
定义
保证一个类只有一个实例,且提供全局的访问点
重点
确保只有一个实例,并提供全局访问
例子
「假设」 设置一个教师,多次调用也只设置一次
「实现」 我们可以使用闭包缓存一个内部变量来实现这个单例
function Teacher(name) {
this.name = name;
}
Teacher.prototype.getName = function() {
console.log(this.name);
};
var SingletonTeacher = (function() {
var teacher = null;
return function(name) {
if (!teacher) {
teacher = new Teacher(name);
}
return teacher;
};
})();
SingletonTeacher("a").getName(); // a
SingletonTeacher("b").getName(); // a
SingletonTeacher("c").getName(); // a
这是比较简单的做法,但是假如我们还要设置一个 Student
呢?就得复制一遍代码了
所以,可以改写单例内部,实现地更通用一些
// 提取出通用的单例
function getSingleton(fn) {
var instance = null;
return function() {
if (!instance) {
instance = fn.apply(this, arguments);
}
return instance;
};
}
再进行调用,结果还是一样
// 获取单例
var teacherSingleton = getSingleton(function(name) {
var teacher = new Teacher(name);
return teacher;
});
teacherSingleton("a").getName(); // a
teacherSingleton("b").getName(); // a
teacherSingleton("c").getName(); // a
这时,我们添加 Student
时,就不需要更改获取单例内部的实现了,仅需要实现添加 Student
所需要做的,再调用即可
function Student(name) {
this.name = name;
}
Student.prototype.getName = function() {
console.log(this.name);
};
var studentSingleton = getSingleton(function(name) {
var student = new Student(name);
return student;
});
studentSingleton("aa").getName(); // aa
studentSingleton("bb").getName(); // aa
studentSingleton("cc").getName(); // aa