本文章所有内容均摘自《Javascript 设计模式与开发实践》一书(有兴趣的可以购买),加入了一点点自己的理解,写这篇文章的目的是,加强自身对设计模式的理解,以及对于没有接触过这一块的入门者的参考。
阅读本章内容,需要具备 Javascript 面向对象的知识,否则阅读起来可能会些许困难。
单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池、全局缓存、浏览器中的 window 对象。在 Javascript 开发中,单例模式的用途也非常广泛。
试想下,当我们点击登录按钮的时候,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少次登录按钮,这个浮窗都只会被创建一次,那么这个登录浮窗就适合用单例模式来创建。
要实现一个标准的单例模式并不复杂,无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象。
- var Singleton = function(name) {
- this.name = name;
- };
- Singleton.prototype.getName = function() {
- alert(this.name)
- };
- Singleton.getInstance = (function() {
- var instance = null;
- return function(name) {
- if (!instance) {
- instance = new Singleton(name);
- }
- return instance;
- }
- })();
- var a = Singleton.getInstance('tom');
- var b = Singleton.getInstance('jerry');
- console.log(a === b); //true
代码解释:
Singleton.getInstance 函数里面则是通过判断 instance 是否为空,如果为空的话,实例化 Singleton 类。这样可以保证这个类只会被实例化一次。
符合单例模式。
这种方式相对简单,但有一个问题,就是增加了这个类的 "不透明性",Singleton 类的使用者必须知道这是一个单例类,跟以往通过 new XX 的方式来获取对象不同,这里偏要使用 Singleton.getInstance 来获取对象。
来源: http://www.bubuko.com/infodetail-1950620.html