Singleton(单例)模式被熟知的原因是因为它限制了类的实例化次数只能一次。从经典意义上来说,Singleton模式,在该示例不存在的情况下,可以通过一个方法创建一个类来创建类的新示例;如果实例已经存在,它会简单返回该对象的引用。
在JS中,Singleton充当共享资源命名空间,从全局命名空间中分离出代码实现,从而为函数提供单一访问点。
单例模式特点:
----------------------------------------------------------------------------------------------------------------
在JS中,实现单例模式的方法有很多种,其中最简单的是使用对象字面量
var mySingleton = {
property: "something",
property2: "something else",
method1: function() {
console.log("hello world");
}
}
如果以后要扩展该对象,你可以添加自己的私有成员和方法,然后使用闭包在其内部封装这些变量和函数声明。只暴露你想暴露的public成员和方法:
var mySingleton = function() {
// 这里声明私有变量和方法
var privateVariable = 'something private';
function showPrivate() {
console.log(privateVariable);
}
// 公有..
return {
publicMethod: function() {
showPrivate();
},
publicVar: 'the public can see this!'
};
};
var single = mySingleton();
single.publicMethod();
console.log(single.publicVar);
自己:单例就是指只有一个对象
做到只有在使用的时候才初始化
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();
在实践中,当在系统中确实需要一个对象来协调其他对象时,Singleton模式时很有用的。
var SingletonTester = (function() { //一个对象
// options:包含singleton所需配置信息的对象
// e.g. var options = { names: "test", pointX: 5};
function Singleton(options) {
// 如果未提供options,则设置为空对象
options = options || {};
// 为singleton设置一些属性
this.name = "SingletonTester";
this.pointX = options.pointX || 6; //pointX不要写错
this.pointY = options.pointY || 10;
}
// 实例持有者
var instance;
// 静态变量和方法的模拟
var _static = { //另一个对象
name: "SingletonTester",
// 获取实例的方法,返回singleton对象的singleton实例
getInstance: function(options) {
if(instance === undefined) {
instance = new Singleton(options);
}
return instance;
}
};
return _static;
})();
var singletonTest = SingletonTester.getInstance({
pointX: 5,
pointY: 5
});
// 记录pointX的输出以便验证
// 输出:5
console.log(singletonTest.pointX);
// 输出:5
console.log(singletonTest.pointY);
//Singleton很有使用价值。
var singletonTest1 = SingletonTester.getInstance({
pointX: 8,
pointY: 8
});
// 输出:5
console.log(singletonTest1.pointX);
// 输出:5
console.log(singletonTest1.pointY);
总的来说,单例模式相对而言是各大模式中较为简单的,但是单例模式也是较为常用并且很有用的模式。在JS中尤为突出(每个对象字面量都可以看做是一个单例)。
记住,是否严格的只需要一个实例对象的类(虽然JS没有类的概念),那么就考虑使用单例模式。
使用数据缓存来存储该单例,用作判断单例是否已经生成,是单例模式主要的实现思路。
--------------------------------------------------------------------------------------------------------------
摘录于:
http://www.cnblogs.com/TomXu/archive/2012/02/20/2352817.html
《Javascript设计模式》
http://www.cnblogs.com/chris-oil/p/4092865.html
http://www.runoob.com/design-pattern/singleton-pattern.html
JS单例模式的两种方案:
http://www.jb51.net/article/42302.htm
JS单例模式在工作中的使用:
http://blog.csdn.net/u011277123/article/details/52667555
单例模式的常见应用场景:
http://blog.csdn.net/tanyujing/article/details/14160941
由《JS单例模式在工作中的使用》做的简单程序:
示例一:
common.js
function $(){
return 1;
}
common1.js
function $(){
return 2;
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script src="js/common.js"></script>
<script src="js/common1.js"></script>
<script>
//输出:2
console.log($());
</script>
</body>
</html>
index1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script src="js/common1.js"></script>
<script src="js/common.js"></script>
<script>
//输出:1
console.log($());
</script>
</body>
</html>
实例二:
common2.js
//让我想起了数据库表的前缀
//这里使用了单例
var $2 = {
$: function(){
return 2;
}
}
common3.js
var $3 = {
$: function(){
return 3;
}
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script src="js/common2.js"></script>
<script src="js/common3.js"></script>
<script>
//输出:2
console.log($2.$());
//输出:3
console.log($3.$());
</script>
</body>
</html>
自己:在项目比较大的时候,JS文件比较多,函数或变量比较多,就很有可能引起变量和函数命名冲突,造成意外的覆盖或其他效果,这时候就需要单例来解决。
自己:让我想起前面发的博客中的那个init.php