js.pattern -s 享元模式

优化性能生成大量相似的对象

如页面翻页的时候,只保留结构模板,而替换中间的数据

'use strict';
/**
 * 享元元素
 */
let flyweightIphone = (function () {
    let _model = Symbol("model");
    let _screen = Symbol("screen");
    let _memory = Symbol("memory");
    class iphone {
        constructor(model, screen, memory) {
            this[_model] = model;
            this[_screen] = screen;
            this[_memory] = memory;
        }
    }
    return iphone;
})();

/**
 * 享元工厂
 * @type {{get}}
 */
let flyweightFactory = (function () {
    var iphones = {};
    return {
        get: function (model, screen, memory) {
            const key = model + screen + memory;
            return iphones[key] || new flyweightIphone(model, screen, memory);
        }
    }
})();

/**
 * 享元类
 */
let iphone = (function () {
    let _SN = Symbol("SN");
    let _flyweight = Symbol("flyweight");

    class iphone {
        constructor(model, screen, memory, SN) {
            this[_flyweight] = flyweightFactory.get(model, screen, memory, SN);
            this[_SN] = SN;
        }
    }
    return iphone;
})();

/**
 * 享元测试
 */
let for_iphone = function () {
    var phones = [];
    for (var i = 0; i < 100; i++) {
        let memory = i % 2 == 0 ? 16 : 32;
        phones.push(new iphone("iphone6s", 5.0, memory, i));
    }
}

function cal_fn_time(fn) {
    var timebegin = (new Date()).getTime();
    console.log(for_iphone);
    fn();
    var timeend = (new Date()).getTime();
    return (timeend - timebegin)/1000 + "s";
}

console.log(cal_fn_time(for_iphone));

//享元元素

function IphoneFlyweight(model, screen, memory) {
    this.model = model;
    this.screen = screen;
    this.memory = memory;
}

//享元工厂,生成共享的对象;生成字典保存并获取享元对象

var flyweightFactory = (function () {
    var iphones = {};
    return {
        get: function (model, screen, memory) {
            var key = model + screen + memory;
            if (!iphones[key]) {
                iphones[key] = new IphoneFlyweight(model, screen, memory);
            }
            return iphones[key];
        }
    };
})();

//关键在于除去了唯一的值之外,生成的共享元素并不多,可以直接获取

 function Iphone(model, screen, memory, SN) {
    this.flyweight = flyweightFactory.get(model, screen, memory);
    this.SN = SN;
}

//最终生成的数据

var phones = [];
for (var i = 0; i < 1000000; i++) {
    var memory = i % 2 == 0 ? 16 : 32;
    phones.push(new Iphone("iphone6s", 5.0, memory, i));
}
console.log(phones);

在DOM的应用是:事件委托也运用了享元模式的原理

(".menu").on("click", ".item", function () {
    console.log($(this).text());
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined、Nul...
    极乐君阅读 5,626评论 0 106
  • 1 场景问题# 1.1 加入权限控制## 考虑这样一个问题,给系统加入权限控制,这基本上是所有的应用系统都有的功能...
    七寸知架构阅读 2,531评论 1 57
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,805评论 18 399
  • 在不谙世事的年纪里 种种较真 碌碌无为 却还安慰自己平凡可贵 也终于明白 有一种情绪 无法用言语形容 明媚但忧伤 ...
    甜辣酱一阅读 308评论 6 5
  • 1,从本篇文章中我学到的最重要的概念: 在以后自己阅读和任教的过程中,不要把阅读当做完成任务,要学着培养自己和学...
    117刘景景阅读 258评论 1 0