JavaScript享元模式与开发实践(下)

文章介绍了前端开发者如何理解和运用享元模式来提升代码效率。通过创建对象工厂解决非必需时的对象实例化,并引入管理器来处理复杂的外部状态,以此优化享元模式的应用。同时指出,虽然享元模式能优化性能,但也会增加系统的复杂性,应在必要时使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

作为一个前端切图仔,少有和各类设计模式打交道。但这不影响我们学习设计模式的思维,来提升我们的代码水平。

本章通过讲解享元模式,希望能够让你对设计模式更一步的学习。

本章学习内容👇

  • 享元模式通用结构

享元模式通用结构

在上一节中《 JavaScript享元模式与开发实践(上)》

我们初步展示了享元模式的威力,但其实还没有真正的完成一个完整的享元模式,在这个例子中还存在以下俩个问题:

  • 我们通过构造函数显示的创造的俩个实例对象,在其他系统中,有可能不是一开始就需要所有的共享对象。
  • 我们给实例对象手动设置underwear的外部状态,但这在更复杂的场景中兵不是个好的解决方案。因为如果当外部状态变得相当复杂时,它们与共享对象的联系就会变得很困难。

对于这俩个问题我们提出以下俩点解决方案👇

  • 我们通过一个对象工厂/一个方法来判断,只有当共享对象被真正需要时,它才从工厂中被创建出来。
  • 对于管理外部状态,我们可以追加一个管理器用于记录对象相关的外部状态,使得这些外部状态通过某个钩子和共享对象相联系起来。

接着, 我们根据这俩点来改装下我们的享元模式,

工厂进行对象实例化

我们通过一个工厂来创建model对象,如果某种内部状态对应的对象已经被创建过,那么直接返回这个对象,否则创建一个新的对象:

let createModel =(function (){
    let createModels = {};
​
    return {
        create:function (type){
            if (createModels[type]){
                return createModels[type]
            }
            return createModels[type] = new Model(type)
        }
    }
})

管理器封装外部状态

我们用一个对象来充当管理器,它负责向工厂createModel提交创建对象的请求,并用一个DataBase对象保存所有的外部状态。外部在给共享对象设置外部状态时就可以使用。

let ModelManager = (function (){
    let modelDatabase = {
​
    }
    return {
        add:function (sex){
            let modelObj = createModel.create(sex)
            modelDatabase[sex] = {}
        },
        setExternalState:function (sex,underwear){
           modelDatabase[sex].underwear = underwear
        }
    }
})

尾声

享元模式是一种很好的性能优化方案,但它也会带来一些复杂性的问题,我们需要分别多维护一个工厂对象以及一个管理器对象,在大部分不必要使用享元模式的场景中,这些开销我们应该尽量避免。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值