单例模式
单例模式(Singleton):又被称为单体模式,是只允许实例化一次的对象类,即保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在就直接返回,不存在则创建了再返回实例,这就确保了一个类只有一个实例对象。有时我们也使用一个对象来规划一个命名空间。
在javascript里,实现单例的方法有很多种,其中最简单的一个方式是使用对象字面量的方法:
var mySingleton = {
property1: "something",
property2: "something2",
method1: function () {
console.log("method1");
}
};
如果以后要拓展该对象,你可以添加自己的私有属性和方法,然后使用闭包在其内部封装这些变量和函数声明,只暴露你想要的:
var mySingleton = function () {
/* 声明私有变量和方法*/
var privateVar = "something private";
function showPrivate () {
console.log(privateVar);
}
/* 公有变量和方法*/
return {
publicMethod: function () {
showPrivate();
},
publicVar: 'public variable'
}
};
var single = mySingleton();
single.publicMethod(); // something private
console.log(single.publicVar); // public variable
如果我们只有在使用的时候才初始化,那应该怎么做呢?
var Singleton = (function() {
var instance = null;
function init() {
/* 定义单例代码 */
return {
publicMethod: function () {
console.log("public method");
},
publicProperty: 'public property'
}
}
return {
getInstance: function () {
if (!instance) {
instance = init();
}
return instance;
}
}
})();
/* 调用公有的方法来获取实例*/
Singleton.getInstance().publicMethod(); // public method
这种方法也被称为“惰性创建”。
使用场景:
一般是用在系统间各种模式的通信协调上。
var SingletonTester = (function () {
function Singleton (args) {
args = args || {};
this.name = "SingletonTester";
this.pointX = args.pointX || 1;
this.pointY = args.pointY || 1;
}
// 实例容器
var instance;
var _static = {
name: 'SingletonTester',
// 获取实例的方法
getInstance: function (args) {
if (instance === undefined) {
instance = new Singleton(args);
}
return instance;
}
}
return _static;
})();
var singletonTest = SingletonTester.getInstance({ pointX: 3});
console.log(singletonTest.pointX); // 3
参考资料:
https://addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript