JS——单例模式

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

单例模式如何运用在实际项目中呢?别人说,单例模式可以用在登录注册中,怎么搞呢?












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值