第八章 单例模式

65 阅读1分钟

单例模式(Signleton):又被称为单体模式,是只允许实例化一次的对象类。

有时我们也用一个对象来规划一个命名空间,井井有条地管理对象上的属性和方法。

命名空间

命名空间就是人们所说的 namespace,也称为名称空间。

由于不同的人定义的变量或者方法使用的单词名称可能重复,此时就需要用命名空间来约束每个人定义的变量来解决这类问题。

var Ming = {
	g: function(id) {
  	return document.getElementById(id)
  },
  css: function(id, key, value) {
    // 通过当前对象 this 来使用 g 方法
  	this.g(id).style[key] = value
  }
}

创建一个小型代码库

我们以后写自己的小型方法库的时候也可以用单例模式来规范我们自己代码库的各个模块。

比如,我们有一个 A 库,它包含公用模块、工具模块、ajax 模块和其他模块。

var A = {
	Util: {
  	util_method1: function() {},
    util_method2: function() {}
  },
  Tool: {
  	tool_method1: function() {},
    tool_method2: function() {}
  },
  Ajax: {
  	get: function() {},
    post: function() {}
  },
  Others: {
  	// ...
  }
}

// 使用如下
A.Util.util_method1();
A.Ajax.get();

无法修改的静态变量

静态变量采用大写

var Conf = (function() {
	// 私有变量
  var conf = {
  	MAX_NUM: 100,
    MIN_NUM: 1,
    COUNT: 1000
  }
  // 返回取消器对象
  return {
  	// 取指器方法
    get: function() {
    	return conf[name] ? conf[name] : null;
    }
  }
})();

“很奇妙呀,没有赋值器我们就不能修改内部定义的变量了。“

// 使用如下
var count = Conf.get('COUNT');
console.log(count); // 1000

惰性实例

有时候对于单例对象需要延迟创建,所以在单例中还存在一种延迟创建的形式,有人也称之为惰性创建

// 惰性载入单例
var LazySignle = (function() {
	var _instance = null;
  // 单例
	function Signle() {
  	return {
    	publicMethod: fucntion() {},
      publicProperty: '1.0'
    }
  }
  // 获取单例对象接口
  return function() {
		if (!_instance) {
    	_instance = Signle()
    } else {
    	return _instance;
    }
	}
})();

// 测试如下
console.log(LazySignle().publicProperty); // 1.0