在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();
这样就做到了只有在使用时才初始化。
单例模式要点:某个“类”只有一个模式,必须自己创建这个实例,且向系统提供这个实例。