js40---享元模式

Posted 672530440

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js40---享元模式相关的知识,希望对你有一定的参考价值。

/**
 * 享元模式是一个为了提高性能(空间复杂度)的设计模式
 * 他使用与程序会生产大量的相类似的对象是耗用大量的内存的问题
 */
(function(){
    /**
     * 制造商
     * 型号
     * 拥有者
     * 车牌号码
     * 生产日期
     */
    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;
        }
    }

    var simpleProfiler2 = function(componet){//形参看成构造函数传入的成员变量的值。函数名看成类名。this.看成成员属性和成员方法。
        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);                
            }
        }
    }    
    //北京车两 4150000 全部要登记
    var ca = new Array();
    function addCar(){
        this.begin = function(){
            for (var i = 0; i < 4150000; i++) {
                ca.push(new Car("东风","雪铁龙","2012-4-8",
                    "云凤程","京pcat2145","2012-2-13"));
            }
        }
    }
    new simpleProfiler2(new addCar()).action("begin")
    /**
     * extjs的开发下拉框,单选框
     * 等小组件如果用享元模式 会非常的节省性能的开支
     */    
})()
/**
 * 享元模式是一个为了提高性能(空间复杂度)的设计模式
 * 他使用与程序会生产大量的相类似的对象是耗用大量的内存的问题
 */
(function(){
    /**
     * 制造商
     * 型号
     * 拥有者
     * 车牌号码
     * 生产日期
     */
    var Car = function(make,model,year){
        ///共性属性
        this.make = make;
        this.model = model;
        this.year = year;
        this.getMake = function(){
            return this.make;
        }
    }
    
    var carInfoFactory = (function(){//carInfoFactory代指内部函数、类,匿名函数执行,就相当于外部函数执行了一次,内部函数执行多次公用外部数据
        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;
                
            }
        }
    })();
    
    //工厂
    var myCarInfo = function(){
        this.createCar = function(make,model,year,owner,tag,renewDate){
            var c = carInfoFactory(make,model,year);//外部函数,利用闭包,调用多次减少了new的时间
            //特性不同的属性
            c["owner"] = owner;
            c["tag"] = tag;
            c["renewDate"] = renewDate;
            return c;//返回的是地址,同一个对象
        }
    }
        
    var test = new myCarInfo();//工厂对象只有一个
    var startDate = new Date().getTime();
    var ca = new Array();
    for (var i = 0; i < 5; i++) {
        ca.push(test.createCar("东风","雪铁龙","2012-4-8",
                    "云凤程","京pcat2145","2012-2-13"))//生产车的方法调了4150000次
    }
    var endDate = new Date();
    alert(endDate - startDate);    
    for(arr in ca){
        alert(ca[arr].make + "--" +ca[arr].renewDate)
        
    }
})()

 

以上是关于js40---享元模式的主要内容,如果未能解决你的问题,请参考以下文章

浅谈js设计模式 — 享元模式

js设计模式之享元模式

设计模式 结构型模式 -- 享元模式(定义 示例 优缺点分析 使用场景)

享元模式

11-享元(Flyweight)模式Ruby实现

设计模式课程 设计模式精讲 13-1 享元模式coding