javascript之享元模式

本文通过示例比较了两种展示内衣商品的方式,展示了享元模式如何减少对象创建,提高程序性能。方案一创建了100个对象,而方案二仅用2个对象,揭示了享元模式在处理大量相似对象时的优势。通过工厂模式和管理函数进一步优化,降低了内存占用。
摘要由CSDN通过智能技术生成

享元模式是一种优化程序性能的模式, 本质为减少对象创建的个数。

以下情况可以使用享元模式:
有大量相似的对象, 占用了大量内存
对象中大部分状态可以抽离为外部状态

某商家有 50 种男款内衣和 50 种款女款内衣, 要展示它们

方案一: 造 50 个塑料男模和 50 个塑料女模, 让他们穿上展示, 代码如下:

const Model= function(gender,underwear){
          this.gender = gender
          this.underwear = underwear
        }
        Model.prototype.takePhoto = function(){
          console.log(`${this.gender}在试穿${this.underwear}`);
        }

        for (let index = 1; index < 51; index++) {
          const model = new Model('male',`第${index}款衣服`)
          model.takePhoto()
        }
         for (let index = 1; index < 51; index++) {
          const model = new Model('female',`第${index}款衣服`)
          model.takePhoto()
        }

方案二: 造 1 个塑料男模特 1 个塑料女模特, 分别试穿 50 款内衣

 const Model= function(gender){
          this.gender = gender
        }
        Model.prototype.takePhoto = function(){
          console.log(`${this.gender}在试穿${this.underwear}`);
        }
       const maleModel = new Model('male')
       const femaleModal = new Model('female')
        for (let index = 1; index < 51; index++) {
          maleModel.underwear = `第${index}款衣服`
          maleModel.takePhoto()
        }
         for (let index = 1; index < 51; index++) {
          femaleModal.underwear = `第${index}款衣服`
          femaleModal.takePhoto()
        }

对比发现: 方案一创建了 100 个对象, 方案二只创建了 2 个对象, 在该 demo 中, gender(性别) 是内部对象, underwear(穿着) 是外部对象。

当然在方案二的 demo 中, 还可以进一步改善:

1 一开始就通过构造函数显示地创建实例, 可用工场模式将其升级成可控生成
2 在实例上手动添加 underwear 不是很优雅, 可以在外部单独在写个 manager 函数

  const Model = function(gender){
        this.gender = gender
      }
      Model.prototype.takePhoto = function(){
        console.log(`${this.gender}试穿${this.underwear}`);
      }
      const modelFactory = (function(){  //优化第一点
        const modelObj = {}
          return{
            createModel:function(gender){
              if(modelObj[gender]){
                return modelObj[gender]
              }
              return modelObj[gender] = new Model(gender)
            }
          }
      }())
      const modelManage =(function(){
        const manageObj = {}
        return{
          add:function(gender,i){
            manageObj[i]={
              underwear:`第${i}款衣服`
            }
            return modelFactory.createModel(gender)
          },
          copy:function(model,i){  //优化第二点
            model.underwear = manageObj[i].underwear
          }
        }
      }())
      for (let index = 1; index < 10; index++) {
         const maleModel = modelManage.add('male',index)
         modelManage.copy(maleModel,index)
         maleModel.takePhoto()
      }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值