vlambda博客
学习文章列表

我爱设计模式-单例模式

定义

保证一个类只有一个实例,且提供全局的访问点

重点

确保只有一个实例,并提供全局访问

例子

「假设」 设置一个教师,多次调用也只设置一次

「实现」 我们可以使用闭包缓存一个内部变量来实现这个单例

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(thisarguments);
    }

    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

扫码关注