JavaScript设计模式中的享元模式

Posted 三水草肃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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. 注意:

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

      1. 通过工厂来解决第一个问题,只有当某种共享对象被真正需要时,它才从工厂中创建出来。
      2. 第二个问题,可以用一个管理器来记录对象相关的外部状态,使这些外部状态通过某个钩子和共享对象联系起来。

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

设计模式之享元模式与组合模式详解和应用

享元模式

第17课:生活中的享元模式——颜料很贵必须充分利用

不一样的享元模式(设计模式四)

设计模式-享元模式

设计模式---享元模式