前言
作为一个前端切图仔
,少有和各类设计模式打交道。但这不影响我们学习设计模式的思维,来提升我们的代码水平。
本章通过讲解享元模式
,希望能够让你对设计模式更一步的学习。
本章学习内容👇
- 享元模式通用结构
享元模式通用结构
我们初步展示了享元模式
的威力,但其实还没有真正的完成一个完整的享元模式
,在这个例子中还存在以下俩个问题:
- 我们通过构造函数显示的创造的俩个实例对象,在其他系统中,有可能不是一开始就需要所有的共享对象。
- 我们给实例对象手动设置
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
}
}
})
尾声
享元模式
是一种很好的性能优化方案,但它也会带来一些复杂性的问题,我们需要分别多维护一个工厂对象以及一个管理器对象,在大部分不必要使用享元模式
的场景中,这些开销我们应该尽量避免。