JavaScript设计模式中的享元模式
Posted 三水草肃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript设计模式中的享元模式相关的知识,希望对你有一定的参考价值。
享元模式
可以解决大量对象带来的性能问题,为解决性能问题而生的设计模式,通过时间换空间的优化模式
享元模式要求将对象的属性划分为内部状态和外部状态(状态在通常为属性),享元模式的目标是尽量减少共享对象的数量。
如何划分内部状态和外部状态
把所有的内部状态相同的对象都指定为同一个共享的对象,而外部状态可以从对象身上剥离出来,并存储于外部。
内部状态
- 存储于对象内部
- 被一些对象共享
- 独立于具体的场景,通常不会变
外部状态
- 取决于具体的场景,并根据场景而变化,外部状态不能被共享
使用方法
-
剥离了外部状态对象成为共享对象,外部状态在必要时被传入共享对象来组装成一个完整的对象。虽然组装对象需要耗费一些时间,但是可以大大减少系统中的对象数量。
-
在下面例子中,性别是内部状态,内衣是外部状态,通过区分这两种状态,大大减少系统中的对象数量。通常来讲,内部状态有多少种组合,系统中便最多存在多少个对象。
-
使用享元模式关键是区分内部状态和外部状态,可以被对象共享的属性是内部状态,不可以被共享的是外部状态,不管什么衣服都可以按照性别来区别不同。外部状态取决于具体的场景,并根据场景而变化,就像例子中每件衣服都是不同的,他们不能被对象共享,因此只能被划分为外部状态。
/** * * 每次只需要传一个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();
-
注意:
- 我们通过构造函数显示 new 出了男女两个 model 对象,在其他系统中,也许并不是一开始就需要所有的共享对象
- 给 model 对象手动设置了 undewear 外部状态,在更复杂的系统中,这不是一个最好的方式,因为外部状态可能会相当复杂,他们与共享对象的联系会变得困难
-
解决:
- 通过工厂来解决第一个问题,只有当某种共享对象被真正需要时,它才从工厂中创建出来。
- 第二个问题,可以用一个管理器来记录对象相关的外部状态,使这些外部状态通过某个钩子和共享对象联系起来。
-
以上是关于JavaScript设计模式中的享元模式的主要内容,如果未能解决你的问题,请参考以下文章