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

75 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情

前言

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

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

本章学习内容👇

  • 享元模式通用结构

享元模式通用结构

在上一节中《 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
        }
    }
})

尾声

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