JS——单例模式

来源:互联网 发布:基于of数据库管理系统 编辑:程序博客网 时间:2024/06/02 03:48

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的输出以便验证// 输出:5console.log(singletonTest.pointX);// 输出:5console.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>//输出:2console.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>//输出:1console.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>//输出:2console.log($2.$());//输出:3console.log($3.$());</script></body></html>
自己:在项目比较大的时候,JS文件比较多,函数或变量比较多,就很有可能引起变量和函数命名冲突,造成意外的覆盖或其他效果,这时候就需要单例来解决。
自己:让我想起前面发的博客中的那个init.php

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