zoukankan      html  css  js  c++  java
  • javascript设计模式学习之四——单例模式,缓存与对象池

    单例模式的定义:确保一个实例,并提供全局访问。

    惰性单例的定义:只在需要的时候才创建对象。

    在开发中,有些对象往往只需要一个,比如线程池、全局缓存、浏览器中的window对象等。

    java中的单例

    关键在于使用一个变量来标志当前是否为某个类创建过对象。

    public class Singleton {  
        private Singleton() {}  
        private static Singleton single=null;  
        //静态工厂方法   
        public static Singleton getInstance() {  
             if (single == null) {    
                 single = new Singleton();  
             }    
            return single;  
        
       }
    }

    这样的单例类有一定的“不透明性”,其使用者必须知道这是一个单例类,不能通过New xxx的方式创建实例,而是需要使用Singleton.getInstance方法来获取对象。

    javascript中的单例模式

    根据单例模式的特点:1)只有一个实例,2)对外提供全局访问;

    1)javascript中的全局对象自变量无疑符合单例的特征,但其缺点是不可避免会有全局污染的问题;

    2)下面是一种通用的惰性单例的实现方法

            document.addEventListener('DOMContentLoaded',function(){
          //getSingle是创建单例通用的方法
    var getSingle=function(fn){ var ret; return function(){ return ret||(ret=fn.apply(this,arguments)); }; }; //下面以创建唯一的登陆浮窗为例 var createLoginLayer=function(){ var div=document.createElement('div'); div.innerHTML='我是登陆浮窗'; document.body.appendChild(div); return div; }; var getSingleLoginLayer=getSingle(createLoginLayer); var div1=getSingleLoginLayer(); var div2=getSingleLoginLayer(); console.log(div1===div2); //输出true },false);

    变量缓存

     如果ret不是基本变量,而是一个对象,则可以用来实现缓存,在jQuery的源代码中有很多这样的例子。

        var cache={};//一般定义为一个全局变量
        var tmp=cache[key]||fn(key);

    对象池

    对象池维护一个装载着空闲对象的池子,如果需要对象的时候,不是直接new,而是从对象池中取出,如果对象池中没有空闲对象,则新建一个空闲对象。对象池技术的使用非常广泛,http连接池和数据库连接池都是其代表。在web前端中,对象池使用最多的使得DOM有关的操作。

    对象池的实现:

    //对象池
    var objectPoolFactory=function(createObjFn){
        var pool=[],
            create=function(){
                var obj=pool.length>0?pool.shift():createObjFn.apply(this,arguments);            
                return obj;
            },
            recover=function(obj){
                pool.push(obj);
            };
        return {
            create:create,
            recover:recover,
        };
    };
  • 相关阅读:
    Android深入四大组件(九)Content Provider的启动过程
    mysql启动时报错:Starting MySQL... ERROR! The server quit without updating PID file (/opt/mysql/data/mysql.pid) 的解决方法
    定制rpm包-Yum环境搭建
    FPM定制RPM包实践
    nginx服务企业应用
    keepalived中的脑裂
    Linux 进程后台运行的几种方式(screen)
    ansible服务部署与使用
    HTTP服务原理
    KICKSTART无人值守安装
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/5595730.html
Copyright © 2011-2022 走看看