• JavaScript设计模式中的享元模式


    享元模式

    可以解决大量对象带来的性能问题,为解决性能问题而生的设计模式,通过时间换空间的优化模式
    享元模式要求将对象的属性划分为内部状态和外部状态(状态在通常为属性),享元模式的目标是尽量减少共享对象的数量。

    如何划分内部状态和外部状态

    把所有的内部状态相同的对象都指定为同一个共享的对象,而外部状态可以从对象身上剥离出来,并存储于外部。

    内部状态

    1. 存储于对象内部
    2. 被一些对象共享
    3. 独立于具体的场景,通常不会变

    外部状态

    1. 取决于具体的场景,并根据场景而变化,外部状态不能被共享

    使用方法

    1. 剥离了外部状态对象成为共享对象,外部状态在必要时被传入共享对象来组装成一个完整的对象。虽然组装对象需要耗费一些时间,但是可以大大减少系统中的对象数量。

    2. 在下面例子中,性别是内部状态,内衣是外部状态,通过区分这两种状态,大大减少系统中的对象数量。通常来讲,内部状态有多少种组合,系统中便最多存在多少个对象。

    3. 使用享元模式关键是区分内部状态和外部状态,可以被对象共享的属性是内部状态,不可以被共享的是外部状态,不管什么衣服都可以按照性别来区别不同。外部状态取决于具体的场景,并根据场景而变化,就像例子中每件衣服都是不同的,他们不能被对象共享,因此只能被划分为外部状态。

      /**
       *
       * 每次只需要传一个sex和underwaer参数
       *
       */
      const Model = function (sex) {
        this.sex = sex;
      };
      
      Model.prototype.takePhoto = function () {
        console.log("sex=", this.sex, "underwear=", this.underwear);
      };
      
      // 创建男女模特
      const maleModel = new Model("male");
      const femaleModel = new Model("female");
      
      for (let i = 1; i <= 50; i++) {
        maleModel.underwear = "underwear" + i;
        maleModel.takePhoto();
      }
      
      for (let j = 1; j <= 50; j++) {
        femaleModel.underwear = "underwear" + j;
        femaleModel.takePhoto();
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      1. 注意:

        1. 我们通过构造函数显示 new 出了男女两个 model 对象,在其他系统中,也许并不是一开始就需要所有的共享对象
        2. 给 model 对象手动设置了 undewear 外部状态,在更复杂的系统中,这不是一个最好的方式,因为外部状态可能会相当复杂,他们与共享对象的联系会变得困难
      2. 解决:

        1. 通过工厂来解决第一个问题,只有当某种共享对象被真正需要时,它才从工厂中创建出来。
        2. 第二个问题,可以用一个管理器来记录对象相关的外部状态,使这些外部状态通过某个钩子和共享对象联系起来。
  • 相关阅读:
    使用SimPowerSystems并网光伏阵列研究(Simulink实现)
    风力发电一键求助可视对讲终端
    【微信小程序】事件绑定,你搞懂了吗?
    视频导出文件太大如何变小?缩小视频这样做
    原文远知行COO张力加盟逐际动力 自动驾驶进入视觉时代?
    面试题-React(十九):React Hook
    Tomcat相关概述和部署
    基于神经网络的分类和预测
    【笔试强训】day1
    [Python] Python编程技巧总结[不断更新....]
  • 原文地址:https://blog.csdn.net/weixin_43405946/article/details/127914772