JS设计模式之单例模式(一)
单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这
就确保了一个类只有一个实例对象。
在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的方法,其字面量里可以包含大量的属性和方法:
           var singleton = {
              name: 'xu',
              age: 2,
              walk: function(){
                  //todo
              },
              eat: function(){
                  //todo
              }
          }
如果以后要扩展该对象,你可以添加自己的私有成员和方法,然后使用闭包在其内部封装这些变量和函数声明。
只暴露你想暴露的public成员和方法,样例代码如下:
    var mySingleton = function(){
              // 这里声明私有变量和方法;
              var privateVariable = 'something private that others cannot get';
              function showPrivate(){
                  console.log(privateVariable);
              }
              //公有的变量和方法(可以访问私有变量和方法);
              return {
                  publicMethod: function(){
                      showPrivate();
                  },
                  publicVar: 'the public can see this!'
              }
          }
        var single = mySingleton();
        single.publicMethod(); // something private that others cannot get
        console.log(single.publicVar); // the public can see this!
上面的代码很不错了,但如果我们想做到只有在使用的时候才初始化,那该如何做呢?为了节约资源
的目的,我们可以另外一个构造函数里来初始化这些代码,如下:
      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(); // hello world;
知道了单例如何实现了,但单例用在什么样的场景比较好呢?其实单例一般是用在系统间各种模式的通信协调上,下面的代码是一个单例的最佳实践:
         var SingletonTester = (function(){
            // 参数: 传递给单例的一个参数集合;
             function Singelton(args){
                 // 设置args变量为接受的参数或者为空
                 var args = args || {};
                 //设置name参数
                 this.name = 'SingletonTester';
                 // 设置pointX的值
                this.pointX = args.pointX || 6; // 从接受的参数里获取,或者设置为默认值;
                // 设置pointY的值
                this.pointY = args.pointY || 10;
             }
             //实例容器
             var instance;
             var _static = {
                 name: 'SingletonTester',
                 //获取实例的方法
                 //获取Singelton的实例
                 getInstance: function(args){
                     if (instance == undefined) {
                         instance = new Singelton(args);
                     }
                     return instance;
                 }
             };
             return _static;
        })();
        var singeltonTest = SingletonTester.getInstance({pointX: 5});
        console.log(singeltonTest.pointX); //输出 5; 
JS设计模式之单例模式(一)的更多相关文章
- [JS设计模式]:单例模式(1)
		什么是单例模式 所谓单例,就是一个类只有一个实例,实现的方法一般是先判断是否存在实例,如果存在就直接返回,如果不存在就创建了再返回.这样确保了一个类只有一个实例对象. 实现的单例有很多种方式,最简单的 ... 
- js设计模式总结-单例模式
		单例模式 解决的问题 保证实例只有一个,避免多个实现,从全局来看,这个实例的状态是唯一的. 实现原理 设置一个变量来记录实例,通过检测该变量是否为空来决定是否创建实例 非透明单例 所谓非透明就是用户在 ... 
- JS设计模式之---单例模式
		单例模式是保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式在现在面向对象的语言Java,C#,C++等等中也有很多用到,其实它在Javascript中使用同样非常广泛. var Cre ... 
- JS设计模式之单例模式
		单例模式 单例模式的定义是:保证一个类只有一个实例,并提供一个访问它的全局访问点.比如说购物车,在一个商城中,我们只需要一个购物车,购物车在整个商城中是唯一的,不需要多次创建,即使多次点击购物车按钮, ... 
- JS 设计模式二 -- 单例模式
		单例模式 概念 单例模式 就是保证一个类只有一个实例,并提供一个访问它的全局访问点. 实现方法 先判断实例是否存在,如果存在直接返回,如果不存在就创建实例后在返回,确保了一个类只有一个实例对象. va ... 
- 浅谈js设计模式之单例模式
		单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器中的 window 对象等.在 JavaS ... 
- Js常用的设计模式(1)——单例模式
		<Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通 ... 
- JS设计模式(一)
		刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化 ... 
- js设计模式总结1
		js设计模式有很多种,知道不代表会用,更不代表理解,为了更好的理解每个设计模式,对每个设计模式进行总结,以后只要看到总结,就能知道该设计模式的作用,以及模式存在的优缺点,使用范围. 本文主要参考张容铭 ... 
随机推荐
- HZOI20190906模拟39 工业,卡常,玄学
			题面:https://www.cnblogs.com/Juve/articles/11484209.html 工业: 推一个式子,AC 没有用组合数....推了2个多小时 我sbsbsbsbsbsbs ... 
- (转载)关于My97 datepicker与Angular ng-model绑定问题解决。
			转载自 http://zerosoft.blog.51cto.com/679447/1611403 <input type="text" ng-model="d&q ... 
- 科普 | 编译 V8 源码
			2017-02-13 justjavac 象尘说 对于JavaScript程序员来说,可以瞧一瞧justjavac给大家写的科普类读物,V8引擎的分析,“也许你不懂C++”,但是你可以了解一下,总是好 ... 
- 木卯先生的笔记---Object类
			1.简介 Object类是在 java.lang 包下的一个类,它是所有类的父类(也就是所有类都是Object类的子类,如果定义一个类的时候,没有指定继承的类,默认的就是继承Object类),所以Ob ... 
- springmvc:请求参数绑定集合类型
			一.请求参数绑定实体类 domain: private String username; private String password; private Double money; private ... 
- c++使用优先队列时自定义优先出队顺序(和sort)
			优先队列也是一种先进先出的数据结构,元素从队尾入队,从队头出队,但是优先队列相较一般队列多了一个判断优先级的功能,在当前队列中,优先级最高的元素将被第一个删除. 先看一下优先队列的定义 templat ... 
- 使用innerHTML属性向head中插入字符时报“无法设置 innerHTML 属性。  该操作的目标元件无效”的错误
			向head中动态插入script文件,代码如下: var sc = document.createElement("script"); sc.src = "//www.c ... 
- H5C3--边框阴影box-shadow
			<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- BaiduTemplate [ 百度模板引擎 ]
			地址: http://baidufe.github.io/BaiduTemplate/ 
- 笔记本最小安装centos7 连接WiFi的方法
			1.首先下载iw工具. yum -y install iw 2.获取无线网卡的名称 执行iw dev,假设获得名称为 wlp3s0(示例) 3.激活无线网络接口 执行ip link set wlp3s ... 
