享元模式采用一个共享来有效的支持大量细小粒度的对象,避免大量有相同内容的类的开销(如内存耗费),共享一个元类。

应用场景:页面存在大量的资源密集型对象;他们具备一些共性,可以分离出公共操作的数据。

一个例子,汽车登记:

    var Car = function(make,model,year,owner,tag,renewDate){
     this.make=make;
    this.model=model;
    this.year=year;
    this.owner=owner;
    this.tag=tag;
    this.renewDate=renewDate;
  };
  Car.prototype = {
    getMake:function(){
      returnthis.make;
    },
    getModel:function(){
      returnthis.model;
    },
    getYear:function(){
      returnthis.year;
    },
    transferOwner:function(owner,tag,renewDate){
      this.owner=owner;
      this.tag=tag;
      this.renewDate=renewDate;
    },
    renewRegistration:function(renewDate){
      this.renewDate=renewDate;
    }
};  

如果汽车数量多了,就使用享元模式。可以将数据分成内部和外部两种数据,和car对象相关的数据(make, model等)可以归结为内部属性,而(owner, renewDate等)可以归结为外部属性。这样,如下代码就可以在同一车里共享同一个对象了,不管转让给谁,只要车是同一车,基本信息是一样的:

var Car=function(make,model,year){
    this.make=make;
    this.model=model;
    this.year=year;
};
Car.prototype={
    getMake:function(){
      returnthis.make;
    },
    getModel:function(){
      returnthis.model;
    },
    getYear:function(){
      returnthis.year;
    }
};
//中间对象,用来实例化Car类
var CarFactory=(function(){
   var createdCars = {};
   return {
      createCar:function(make,model,year){
        var car=createdCars[make+"-"+model+"-"+year];
        return car ? car : createdCars[make +'-'+ model +'-'+ year] =(new Car(make,model,year));
      }
    };
})();
//数据工厂,用来处理Car的实例化和整合附加数据
var CarRecordManager = (function() {
  var carRecordDatabase = {};
  return {
    addCarRecord:function(make,model,year,owner,tag,renewDate){
      var car = CarFactory.createCar(make, model, year);
      carRecordDatabase[tag]={
          owner:owner,
          tag:tag,
          renewDate:renewDate,
          car:car
      };
    },
    transferOwnership:function(tag, newOwner, newTag, newRenewDate){
        var record=carRecordDatabase[tag];
        record.owner = newOwner;
        record.tag = newTag;
        record.renewDate = newRenewDate;
    },
    renewRegistration:function(tag,newRenewDate){
        carRecordDatabase[tag].renewDate=newRenewDate;
    },
    getCarInfo:function(tag){
        return carRecordDatabase[tag];
    }
  };
})();

通过这种方式,我们做到了将同一车的相同信息保存在一个CarRecordManager对象里,而且只保存一份;相比之前的代码,就可以发现节约了很多内存。

如果一个应用程序使用了大量的对象,而这些大量的对象造成了很大的存储开销时就应该考虑使用享元模式。

javascript设计模式-享元模式的更多相关文章

  1. 读书笔记之 - javascript 设计模式 - 享元模式

    本章探讨另一种优化模式-享元模式,它最适合于解决因创建大量类似对象而累及性能的问题.这种模式在javascript中尤其有用,因为复杂的javascript代码很快就会用光浏览器的所有可用内存,通过把 ...

  2. javascript设计模式——享元模式

    前面的话 享元(flyweight)模式是一种用于性能优化的模式,“fly”在这里是苍蝇的意思,意为蝇量级.享元模式的核心是运用共享技术来有效支持大量细粒度的对象.如果系统中因为创建了大量类似的对象而 ...

  3. javascript 设计模式-----享元模式

    四个轮子,一个方向盘,有刹车,油门,车窗,这些词首先让人联想到的就是一辆汽车.的确,这些都是是一辆车的最基本特征,或者是属性,我们把词语抽象出来,而听到这些词语的人把他们想象陈一辆汽车.在代码里面也是 ...

  4. 8. 星际争霸之php设计模式--享元模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  5. C++设计模式——享元模式

    本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.如果这篇文章对你有帮助,你可以请我喝杯咖啡. » 本文链接:http:// ...

  6. java设计模式——享元模式

    一. 定义与类型 定义:提供了减少对象数量从而改善应用所需的对象结构的方式,运用共享技术有效地支持大量细粒度的对象 类型:结构性 二. 使用场景 (1)  常常应用于系统底层的开发,以便解决系统的性能 ...

  7. 【设计模式】Java设计模式 - 享元模式

    Java设计模式 - 享元模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  8. [设计模式] javascript 之 享元模式;

    享元模式说明 定义:用于解决一个系统大量细粒度对象的共享问题: 关健词:分离跟共享: 说明: 享元模式分单纯(共享)享元模式,以及组合(不共享)享元模式,有共享跟不共享之分:单纯享元模式,只包含共享的 ...

  9. [工作中的设计模式]享元模式模式FlyWeight

    一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...

随机推荐

  1. IntentService简介

    参照文章:http://android.tgbus.com/Android/tutorial/201106/355229.shtml IntentService是Service类的子类,用来处理异步请 ...

  2. 二. Socket用法

    C/S通信架构中,客户端要主动与服务端建立连接,这个链接就是Socket套接字.服务端收到连接请求后,也会开启Socket记录与客户端的链接.C/S两端都要建路Socket才能正常收发数据. 一.构造 ...

  3. ADF_Advanced ADF系列1_Fusion应用的客制和个性化(Part1)

    2015-02-17 Created By BaoXinjian

  4. Form_通过Custom.pll新增菜单项(案例)

    2014-05-31 Created By BaoXinjian

  5. [MySQL] 常用SQL的优化--18.4

    这里介绍下,Insert.Group By等SQL语句的优化方法: 1.大批量数据插入 当load命令导入数据的时候,可以进行适当的设置提高导入速度. 1.1 对于MyISAM表,可以先禁用非唯一索引 ...

  6. 纯HTML页面为了避免频繁前后台Ajax交互方案

    需求: 看这么一个简单的界面. 它有很多下拉框,下拉框中的可选项并不是固定不变的. 由于页面是静态HTML页面,不能使用后台JSP动态生成. 之前的解决方案是,页面打开后使用多个Ajax请求,获取下拉 ...

  7. (转)zookeeper学习记录--附browser

    转自:http://agapple.iteye.com/blog/1111377 背景 前段时间看了S4流计算引擎,里面使用到了zookeeper进行集群管理,所以也就花了点时间研究了下zookeep ...

  8. Map的3种遍历[轉]

    Map<String, String> map = new HashMap<String, String>(); map.put("A", "AA ...

  9. mac打开.caj格式文件

    以为用mac后使用会变得更方便些,写毕设时终于派上用场,可惜啊,mac竟然打不开.caj文件,这意味着什么?相信所有在做毕设的小伙伴们都能懂其中的凄凉.特别是硕士或博士的论文,你得从知网上下上百篇的文 ...

  10. 跨域请求 & jsonp

    0 什么是跨域请求 在一个域名下请求另外一个域名下的资源,就是跨域请求.example 1:比如:我当前的域名是http://che.pingan.com.我现在要去请求http://www.cnbl ...