最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Javascript 设计模式 - 享元模式

    正文概述 掘金(alanyf)   2020-12-15   384

    享元模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

    适应场景

    解决的问题: 在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

    使用注意: 使用了享元模式之后,我们需要分别多维护一个 factory 对象和一个 manager 对象,在大部分不必要使用享元模式的环境下,这些开销是可以避免的。

    因此我们可以在以下场景中使用享元模式:

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

    内部状态与外部状态

    享元模式要求将对象的属性划分为内部状态外部状态(状态在这里通常指属性)。享元模式的目标是尽量减少共享对象的数量,那么如何划分内部状态和外部状态呢?

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

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

    剥离了外部状态的对象成为共享对象,外部状态在必要时被传入共享对象来组装成一个完整 的对象。虽然组装外部状态成为一个完整对象的过程需要花费一定的时间,但却可以大大减少系 统中的对象数量,相比之下,这点时间或许是微不足道的。因此,享元模式是一种用时间换空间的优化模式。

    使用享元模式的关键是如何区别内部状态外部状态

    举例

    • 代码关键点:用 HashMap 对象池存储这些对象。
    // 享元模式,对象池缓存对象
    class colorFactory {
      constructor(name) {
        this.colors = {};
      }
      create(name) {
        let color = this.colors[name];
        if (color) return color;
        this.colors[name] = new Color(name);
        return this.colors[name];
      }
    };
    

    优缺点

    优点: 大大减少对象的创建,降低系统的内存,使效率提高。

    缺点: 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

    参考

    • JavaScript设计模式与开发实践
    • 设计模式 - 菜鸟教程

    起源地下载网 » Javascript 设计模式 - 享元模式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元