zoukankan      html  css  js  c++  java
  • js设计模式(一)---单例模式

    之前有写过但是感觉不是很透彻---重新来过

    单例模式:

      定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。  

    应用场景:

      如果一个对像只需要被创建一次的时候就需要单例模式,例如:线程池、全局缓存、浏览器中的widow对象等。

    实现:

      使用一个变量记录是否为某个类已经创建了对象,如果是,则在下次获取该类实例的时候。直接返回之前创建的对象。

    // 单例模式
    var Singleton = function(name){
        this.name = name;
        this.instance = null;
    };// 获取实例对象
    function getInstance(name) {
        if(!this.instance) {   //一旦被实例化之后就不对其进行在实例化
            this.instance = new Singleton(name);
        }
        return this.instance;
    }
    // 测试单例模式的实例
    var a = getInstance("aa");     --->aa
    var b = getInstance("bb");     --->aa
    console.log(a === b) //true

    你会发现创建实例的逻辑和管理单例的逻辑放在了一起;这个不符合 “单一职责“  的原则

    我们改进下 使用代理的方式使用单例模式

    var Singleton = function(name) {
        this.name = name;
    };
    
    var getSingleton = (function() {
        var instance;
        return function(name) {
            if (!instance) {
                instance = new Singleton(name);
            }
            return instance;
        }
    })();
    var a = new getSingleton('aa');
    var b = new getSingleton('bb');
    console.log(a === b)  //true

     虽然做了分离但是你会发现公共部分的代码还是存在

    于是还而已改进为

    var Singleton = function(name) {
        this.name = name;
    };
    
    var getSingle = function( fn ){
      var result;
      return function(){
        return result || ( result = fn .apply(this, arguments ) );
      }
    };
    
    var createSingle = getSingle(Singleton)
    var a = createSingle('aa')
    var b = createSingle('bb')
    
    console.log(a == b)

    如果你吧单例写到这种程度基本上也就差不多了

  • 相关阅读:
    EasyUI combox实现联动
    房费制(一)——上下机、总结
    6、Cocos2dx 3.0游戏开发的基本概念找个小三场比赛
    java 集装箱 arraylist 用法
    涂料动漫学习笔记(一)
    cocos2d-x plist在拍照
    Hadoop与HBase中遇到的问题(续)java.io.IOException: Non-increasing Bloom keys异常
    Java用ZIP格式压缩和解压缩文件
    Unix/Linux环境C编程新手教程(41) C语言库函数的文件操作具体解释
    Oracle OS认证和口令文件认证方法
  • 原文地址:https://www.cnblogs.com/web-Rain/p/7799671.html
Copyright © 2011-2022 走看看