设计模模式-享元模式

1.描述:享元模式是一种用于性能优化的模式,享元模式的目标是尽量减少共享对象的数量,其关键在于划分出内部属性和外部属性。

2.内部属性和外部属性:内部属性可以理解为对象可共享的属性,比如:不同人都有的名字属性;外部属性可以理解为同一对象在不同场景下就不同的属性,比如:衣服,一个人冬天穿的衣服和夏天穿的衣服是不同的。
如何划分内部属性和外部属性:

  • 内部属性存储于对象内部
  • 内部属性可以被一些对象共享
  • 内部属性独立于具体的场景,通常不会改变
  • 外部属性取决于具体的场景,并根据场景而变化,外部状态不能被共享

3.享元模式适用场景:

  • 一个程序中使用了大量相似的对象
  • 由于使用了大量对象,造成很大的内存开销
  • 对象大多数属性可以变为外部属性
  • 剥离出对象的外部状态之后,可以用相对较少的共享对象取代大量对象

4.实例:100种内衣拍照,男女各50种,生产模特并拍照

不使用享元模式编程实现

var Model = function(sex,underwear){//模特构造函数
    this.sex = sex;
    this.underwear = underwear;
};

Model.prototype.takePhoto = function(){
    console.log('sex='+this.sex+' underwear='+this.underwear);
};

for(var i=0;i<50;i++){
    var maleModel = new Model('male','underwear'+i);
    maleModel.takePhoto();
}

for(var j=0;j<50;j++){
    var femaleModel = new Model('female','underwear'+i);
    femaleModel.takePhoto();
}

使用享元模式实现
内部属性:sex
外部属性:underwear

var Model = function(sex){//模特构造函数
    this.sex = sex;
};

Model.prototype.takePhoto = function(){
    console.log('sex='+this.sex+' underwear='+this.underwear);
};

var ModelFactor = (function(){//使用工厂函数来创建模特对象
    var createdModelObjs = {};
    return {
        create:function(sex){
            if(createdModelObjs[sex]){
                return createdModelObjs[sex];
            }

            return createdModelObjs[sex] = new Model(sex);
        }
    };
})();

var modelManeger = (function(){//使用外部属性管理器来管理外部属性

    return {
        produceModel:function(sex,underwear){
            var modelObj = ModelFactor.create(sex);
            modelObj.underwear = underwear;
            return modelObj ;
        }
    };
})();


for(var j=0;j<50;j++){
    var maleModel = modelManeger('male','underwear'+i);
    maleModel.takePhoto();
}

for(var j=0;j<50;j++){
    var femaleModel = modelManeger('female','underwear'+i);
    femaleModel.takePhoto();
}

这时候我们可以看到,前一种方法每一个模特都需要创建一个对象,而使用享元模式之后是一个性别创建一个模特对象,大大减少了创建对象的数量,减少了内存的占用。当然,实际情况远没这么简单,这里作为一个实例分析,有必要将其简化。

实际上,除了享元模式之外,对象池+事件委托也能达到此类性能优化的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wl_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值