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

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

在开发中,有些对象往往只需要一个,比如线程池、全局缓存、浏览器中的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>?pool.shift():createObjFn.apply(this,arguments);
return obj;
},
recover=function(obj){
pool.push(obj);
};
return {
create:create,
recover:recover,
};
};

javascript设计模式学习之四——单例模式,缓存与对象池的更多相关文章

  1. JavaScript设计模式学习之单例模式

    一.单例模式介绍                 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问, ...

  2. C#设计模式学习笔记-单例模式随笔

    最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...

  3. C#设计模式学习笔记-单例模式(转)

    C#设计模式学习笔记-单例模式 http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html 最近在学设计模式,学到创建型模式的时候,碰到 ...

  4. javascript设计模式学习之十二——享元模式

    一.享元模式的定义及使用场景 享元模式是为了解决性能问题而诞生的设计模式,这和大部分设计模式为了提高程序复用性的原因不太一样,如果系统中因为创建了大量类似对象而导致内存占用过高,享元模式就非常有用了. ...

  5. Javascript设计模式学习一

    学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例 ...

  6. 【Javascript设计模式1】-单例模式

    <parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...

  7. JavaScript设计模式学习之路——面向对象的思想

    今天,我拿到了张容铭写的这本<JavaScript设计模式>这本书,开始了关于JavaScript更深一点的学习. 看到这本书开始的时候,虽然之前通过看书.一些比较好的视频的讲解,对Jav ...

  8. JavaScript设计模式学习笔记

    1 JavaScript设计模式深入分析 私有属性和方法:函数有作用域,在函数内用var 关键字声明的变量在外部无法访问,私有属性和方法本质就是你希望在对象外部无法访问的变量. 特权属性和方法:创建属 ...

  9. JavaScript设计模式 Item 6 --单例模式Singleton

    单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器的window对象.在js开发中,单例模式的 ...

随机推荐

  1. Sql Server 2008:调试

    调试T-SQL语句: 1.Debug普通T-SQL语句: SQL代码如下: use northwind go declare @i int ,@j int,@k int set @i = 1; set ...

  2. 每天学点GDB 15

    本节重点描述两个gdb集成测试环境 有没有办法在一边调试的时候,一边显示对应的源码呢?有没有一种工具能够将gdb集成到ide中呢,本文就试图回答这些问题. emacs gdb 在linux的世界里,e ...

  3. mysql执行完select后,释放游标

    内存释放 在我们执行完SELECT语句后,释放游标内存是一个很好的习惯. .可以通过PHP函数mysql_free_result()来实现内存的释放. 以下实例演示了该函数的使用方法. 2.mysql ...

  4. sqlserver log

    DBCC LOGINFODBCC log('QSSys', TYPE=2)goselect * from sys.fn_dblog(null,null)select [Dirty Pages],[Mi ...

  5. P1032 字串变换

    最近在练习bfs,看到了02年提高组的这个题,顿时来了兴致,联想到前一阵子的八数码问题,具体就是使用一个字符串来存储状态,把他存储到一个图中,然后开始bfs,如果10步之内无法完成就剪枝,同时使用哈希 ...

  6. php常用代码

    $total_count = mysql_num_rows($rslt);//返回记录条数 date("ymdHis");//130618104741 注:年份没有前两位 PHP手 ...

  7. javascript的alert()的消息框不弹出或者弹出信息有误

    有时不知道什么,有时javascript的alert()的消息框不弹出或者弹出信息有误,代码是这么写的: //提示信息 public static void alert(TemplateControl ...

  8. Lazarus for Raspbian安装

    春节前看到树莓派 2代开始销售,第一时间在淘宝下单购买,无奈春节期间放假,要到3月份才可能收到,只能用QEMU模拟器先熟悉树莓系统.对从turbo Pascal开始的人来讲,如果能在树莓系统使用Pas ...

  9. QList内存释放(看它内部存储的是否是Object,另外还有qDeleteAll)

    QList<T> 的释放分两种情况: 1.T的类型为非指针,这时候直接调用clear()方法就可以释放了,看如下测试代码 #include <QtCore/QCoreApplicat ...

  10. Java进制转换

    其他转10进制 System.out.println(Integer.parseInt("10", 2));// bin System.out.println(Integer.pa ...