JavaScript设计模式之享元模式实例详解


Posted in Javascript onJanuary 17, 2019

本文实例讲述了JavaScript设计模式之享元模式。分享给大家供大家参考,具体如下:

通过两个例子的对比来凸显享元模式的特点:享元模式是一个为了提高性能(空间复杂度)的设计模式,享元模式可以避免大量非常相似类的开销。

第一实例,没有使用享元模式,计算所花费的时间和空间使用程度。

要求为:有一个城市要进行汽车的登记

(1)汽车类

/**
* 制造商
* 型号
* 拥有者
* 车牌号码
* 最近一次登记日期
*/
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;
    this.getMake = function(){
      return this.make;
    }
}

(2)使用装饰者模式--计算函数的耗时

//装饰者 .. 计算函数的耗时
var simpleProfiler = function(componet){
    this.componet = componet;
    this.action = function(methodName){
      var self = this;
      var method = componet[methodName];
      //如果是函数那就进行装饰
      if(typeof method == "function"){
        var startDate = new Date().getTime();//开始时间
        method.apply(self.componet,arguments);
        var endDate = new Date();//结束时间
        alert(endDate - startDate);
      }
    }
}

(3)具体的实例,现有4150000辆车需要登记

var ca = new Array();
function addCar(){
    this.begin = function(){
      for (var i = 0; i < 4150000; i++) {
        ca.push(new Car("BMW","宝马","2017-10-18",
          "","GBMW88","2017-10-19"));
      }
    }
}
new simpleProfiler(new addCar()).action("begin")

第二个例子:使用享元模式

(1)汽车类

/**
* 制造商
* 型号
* 拥有者
* 车牌号码
* 最近一次登记日期
*/
var Car = function(make,model,year){
    this.make = make;
    this.model = model;
    this.year = year;
    this.getMake = function(){
      return this.make;
    }
}

(2)单例模式的简单工厂

//单例模式的简单工厂
  var myCarInfo = function(){
    this.createCar = function(make,model,year,owner,tag,renewDate){
      var c = carInfoFactory(make,model,year);
      c["owner"] = owner;
      c["tag"] = tag;
      c["renewDate"] = renewDate;
      return c;
    }
  }
  var carInfoFactory = (function(){
    var carInfo = {};
    return function(make,model,year){
      if(carInfo[make+model+year]){
        return carInfo[make+model+year];
      }else{
        var newCar = new Car(make,model,year);
        carInfo[make+model+year] = newCar;
        return newCar;
        a
      }
    }
  })();

(3)现有4150000辆车需要登记

var test = new myCarInfo();
var startDate = new Date().getTime();
var ca = new Array();
for (var i = 0; i < 4150000; i++) {
    ca.push(test.createCar("BMW","宝马","2017-10-18",
          "","GBMW88","2017-10-19"))
}
var endDate = new Date();
alert(endDate - startDate);

从上述两个例子可以知道,第一个例子没有使用享元模式相对于第二个使用享元模式耗时间少,但空间消耗大,第二个耗时多,但空间消耗小。

第一种情况图解:每次都生成相同的实例

JavaScript设计模式之享元模式实例详解

第二种情况:内在部分(不变)+外部状态(变化)图解

JavaScript设计模式之享元模式实例详解

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript网页关键字高亮代码
Jul 30 Javascript
JQuery 弹出框定位实现方法
Dec 02 Javascript
js使用正则实现ReplaceAll全部替换的方法
Aug 22 Javascript
一个通过script自定义属性传递配置参数的方法
Sep 15 Javascript
JavaScript在网页中画圆的函数arc使用方法
Nov 13 Javascript
JavaScript实现复制内容到粘贴板代码
Mar 31 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
Aug 05 Javascript
js实现百度搜索提示框
Feb 05 Javascript
vue省市区三联动下拉选择组件的实现
Apr 28 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
Jun 14 Javascript
结合Vue控制字符和字节的显示个数的示例
May 17 Javascript
ZK中使用JS读取客户端txt文件内容问题
Nov 07 Javascript
vuex页面刷新后数据丢失的方法
Jan 17 #Javascript
jquery获取img的src值实例介绍
Jan 16 #jQuery
js中int和string数据类型互相转化实例
Jan 16 #Javascript
JavaScript设计模式之观察者模式实例详解
Jan 16 #Javascript
JavaScript设计模式之命令模式实例分析
Jan 16 #Javascript
js删除数组中某几项的方法总结
Jan 16 #Javascript
JavaScript设计模式之责任链模式实例分析
Jan 16 #Javascript
You might like
php 带逗号千位符数字的处理方法
2012/01/10 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
jquery 将disabled的元素置为enabled的三种方法
2009/07/25 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
JavaScript生成指定范围随机数和随机序列的方法
2018/05/05 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
vue监听对象及对象属性问题
2018/08/20 Javascript
vue中设置、获取、删除cookie的方法
2018/09/21 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
python re正则表达式模块(Regular Expression)
2014/07/16 Python
深入浅出分析Python装饰器用法
2017/07/28 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
数据库面试要点基本概念
2013/10/31 面试题
法定代表人资格证明书
2014/09/11 职场文书
python实现网络五子棋
2021/04/11 Python
PostgreSQL将数据加载到buffer cache中操作方法
2021/04/16 PostgreSQL
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
MySQL时间盲注的五种延时方法实现
2021/05/18 MySQL
SQL之各种join小结详细讲解
2021/08/04 MySQL
python在package下继续嵌套一个package
2022/04/14 Python
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis
Vue Element plus使用方法梳理
2022/12/24 Vue.js