• 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);

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

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

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

  • 相关阅读:
    Gym
    HDU 4087 ALetter to Programmers (三维坐标旋转 矩阵 + 矩阵快速幂)
    POJ 3845 Fractal (向量旋转,好题)
    HDU 1700 Points on Cycle (向量旋转 + 圆内接三角形周长和面积最大的是正三角形)
    POJ 1271 Nice Milk (半平面交应用)
    POJ 2540 Hotter Colder (半平面交应用 + 向量旋转)
    luoguP3705 [SDOI2017]新生舞会
    luoguP4123 [CQOI2016]不同的最小割
    luoguP2046 [NOI2010]海拔
    luoguP3227 [HNOI2013]切糕
  • 原文地址:https://www.cnblogs.com/wfaceboss/p/7695606.html
Copyright © 2020-2023  润新知