单体模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一变量进行访问。
单体模式的优点是:
可以用来划分命名空间,减少全局变量的数量。 使用单体模式可以使代码组织的更为一致,使代码容易阅读和维护。 可以被实例化,且实例化一次。什么是单体模式?单体模式是一个用来划分命名空间并将一批属性和方法组织在一起的对象,如果它可以被实例化,那么它只能被实例化一次。
但是并非所有的对象字面量都是单体,比如说模拟数组或容纳数据的话,那么它就不是单体,但是如果是组织一批相关的属性和方法在一起的话,那么它有可能是单体模式,所以这需要看开发者编写代码的意图;
下面我们来看看定义一个对象字面量(结构类似于单体模式)的基本结构如下:
// 对象字面量var Singleton = { attr1: 1, attr2: 2, method1: function(){ return this.attr1; }, method2: function(){ return this.attr2; }};
如上面只是简单的字面量结构,上面的所有成员变量都是通过Singleton来访问的,但是它并不是单体模式;因为单体模式还有一个更重要的特点,就是可以仅被实例化一次,上面的只是不能被实例化的一个类,因此不是单体模式;对象字面量是用来创建单体模式的方法之一;
使用单体模式的结构如下demo
我们明白的是单体模式如果有实例化的话,那么只实例化一次,要实现一个单体模式的话,我们无非就是使用一个变量来标识该类是否被实例化,如果未被实例化的话,那么我们可以实例化一次,否则的话,直接返回已经被实例化的对象。
如下代码是单体模式的基本结构:
// 单体模式var Singleton = function(name){ this.name = name; this.instance = null;};Singleton.prototype.getName = function(){ return this.name;}// 获取实例对象function getInstance(name) { if(!this.instance) { this.instance = new Singleton(name); } return this.instance;}// 测试单体模式的实例var a = getInstance("aa");var b = getInstance("bb");
// 因为单体模式是只实例化一次,所以下面的实例是相等的console.log(a === b); // true
由于单体模式只实例化一次,因此第一次调用,返回的是a实例对象,当我们继续调用的时候,b的实例就是a的实例,因此下面都是打印的是aa;
console.log(a.getName());// aaconsole.log(b.getName());// aa
上面的封装单体模式也可以改成如下结构写法:
// 单体模式var Singleton = function(name){ this.name = name;};Singleton.prototype.getName = function(){ return this.name;}// 获取实例对象var getInstance = (function() { var instance = null; return function(name) { if(!instance) { instance = new Singleton(name); } return instance; }})();// 测试单体模式的实例var a = getInstance("aa");var b = getInstance("bb");// 因为单体模式是只实例化一次,所以下面的实例是相等的console.log(a === b); // trueconsole.log(a.getName());// aaconsole.log(b.getName());// aa
新闻热点
疑难解答
图片精选