首页 > 技术文章 > javascript设计模式-单例模式

linda586586 2015-01-12 19:41 原文

  在C#中,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,会提供一个静态方法,通过该静态方法可以取得唯一实例。这就确保了一个类只有一个实例对象:

public class Singleton
{
    private static Singleton _instance = null;
    private Singleton(){}
    public static Singleton CreateInstance()
    {
        if(_instance == null)

        {
            _instance = new Singleton();
        }
        return _instance;
    }
}

 

  在js中,单例模式的定义是产生一个类的唯一实例,但js本身是一种“无类”语言。很多讲js设计模式的文章把{}当成一个单例来使用也说得通。因为js生成对象的方式有很多。

  单例模式是Javascript最基本,最有用的模式之一。它提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码通过单一的变量进行访问。单例在Javascipt中有许多用处,可以用来划分命名空间,以减少全局变量的泛滥。

  Javascript中单例模式的实现方式有多种,每一种都有自身的优点或缺点。

1.对象字面量创建单例

这个也可以归为创建单例的一种方式,在对象字面量中可以添加一些属性和方法:

var mySingleton = {    
     name: "Rose",    
     age: 20,    
     method1: function () {       
//your method
} };

如果要扩展,可以添加属性和方法。利用对象字面量,可以进行命名空间的划分。

2.在函数内部声明私有成员和方法,通过闭包在其内部封装这些变量和函数。只暴露需要暴露的公有成员和方法:

var mySingleton = function () {       
    var privateVariable = 'private var';    
    function showPrivate() {        
        console.log(privateVariable);    
    }    
    return {       
       publicMethod: function () {            
                showPrivate();        
        },        
       publicVar: 'public var'    
    };
};

var single = mySingleton();
single.publicMethod();  // output'private var'
console.log(single.publicVar); // output 'public var'

3.使用立即执行函数进行构造

使用立即执行函数进行构造的一个好处就是节约资源:

var Singleton = (function () {    
    var instantiated;    
    function init() {        
        return {            
         publicMethod: function () {                
             console.log('hello world');            
         },            
         publicProperty: 'test'        
       };    
    }    
    return {        
        getInstance: function () {            
            if (!instantiated) {                
                instantiated = init();            
            }            
            return instantiated;        
        }    
    };
})();
Singleton.getInstance().publicMethod();

这样就做到了只有在使用时才初始化。

 单例模式要点:某个“类”只有一个模式,必须自己创建这个实例,且向系统提供这个实例。

推荐阅读