您的位置:首页 > Web前端 > JavaScript

javascript设计模式--单例模式

2015-10-18 21:43 429 查看
一、什么是单例模式

单例模式也称作为单子模式,更多的也叫做单体模式。为软件设计中较为简单但是最为常用的一种设计模式。

概念理解:

在应用单例模式时,生成单例的类必须保证只有一个实例的存在,很多时候整个系统只需要拥有一个全局对象,才有利于协调系统整体的行为。比如在整个系统的配置文件中,配置数据有一个单例对象进行统一读取和修改,其他对象需要配置数据的时候也统一通过该单例对象来获取配置数据,这样就可以简化复杂环境下的配置管理。

单例模式的思路是:

一个类能返回一个对象的引用(并且永远是同一个)和一个获得该实例的方法(静态方法,通常使用 getInstance 名称)。那么当我们调用这个方法时,如果类持有的引用不为空就返回该引用,否者就创建该类的实例,并且将实例引用赋值给该类保持的那个引用再返回。同时将该类的构造函数定义为私有方法,避免其他函数使用该构造函数来实例化对象,只通过该类的静态方法来得到该类的唯一实例。

单例模式的作用:

主要用来模块间的通信。

二、javascript中单例模式的代码实现

1、实现方法一:对象字面量实现

可以说每一个对象字面量都是一个单例对象。

var singleton = {
attr : 1,
method : function(){ return this.attr; }
}

var t1 = singleton ;
var t2 = singleton ;
t1 === t2 // true


这就是一个单例对象,singleton是全局变量,js载入时被初始化一次。

这种方式具有以下特点:

实现起来简单,非常实用;没有封装性,所有的属性和方法都是暴露的;在this的使用上也存在弊端

2、实现方法二:构造函数内部判断

function Construct(){

// 确保只有单例

if( Construct.unique !== undefined ){

return Construct.unique;

}

// 其他代码

this.name = "Bob";

this.age="24";

Construct.unique = this;

}

var t1 = new Construct() ;

var t2 = new Construct() ;

t1 === t2 ;       //true


这种方式也十分简单,只增加了一个内部判断,来保证只有一个实例。缺点是,一旦在外面修改了Construct的unique属性,那么单例模式也就被破坏了。

3、实现方式三:闭包方式

var single = (function(){

var unique;

function Construct(){

// ... 生成单例的构造函数的代码

}

unique = new Constuct();

return unique;

})();

var t1 = single;
var t2 = single;
t1 === t2; //true


这种方式相对安全一些,但也不是绝对安全。

总结:以上三种方法,算是实现单例模式的最简单的方法,在网上还看大一些,基本上也就大同小异。

当然也有最佳实践:

var SingletonTester = (function () {

//即将被实例的构造函数
//参数:传递给单例的一个参数集合
function Singleton(args) {

//设置args变量为接收的参数或者为空(如果没有提供的话)
var args = args || {};
//设置name参数
this.name = 'SingletonTester';
//设置pointX的值
this.pointX = args.pointX || 6; //从接收的参数里获取,或者设置为默认值
//设置pointY的值
this.pointY = args.pointY || 10;

}

//实例容器
var instance;

return {
name: 'SingletonTester',

//获取实例的方法
//返回Singleton的实例
//由于单例对象一直存在内存之中,如果比较大的实例,一开始就初始化,代价比较高,可以等到需要的时候再初始化
getInstance: function (args) {
if (instance === undefined) {
instance = new Singleton(args);
}
return instance;
}
}

})();

var singletonTest = SingletonTester.getInstance({ pointX: 5 });
console.log(singletonTest.pointX); // 输出 5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: