享元模式是一种用于性能优化的模式,核心是运用共享技术来有效支持大量细粒度的对象。
1.基本实现
/**
* 假设现在有50个product1和50个product2需要录入编号
*/
let product1List = [];
let product2List = [];
let Product = function (name, number) {
this.name = name;
this.number = number;
}
for (let i = 0; i < 50; i++) {
let product = new Product('product1', i);
product1List.push(product);
}
for (let i = 0; i < 50; i++) {
let product = new Product('product2', i);
product2List.push(product);
}
console.log(product1List);
console.log(product2List);
如果将以上代码的条件改为需要录入100000个产品编号,那我们就需要创建出100000个对象,程序可能会直接崩溃。
/** * 考虑一下优化程序,通过观察代码,产品对象实际上只需要两个就够了,每次只需要改变对象的编号 */
let Product = function (name) { this.name = name; }
Product.prototype.setNumber = function(number) { this.number =
number; console.log(this); }let product1 = new Product(‘product1’);
for (let i = 0; i < 50; i++) { product1.number = i;
product1.setNumber(i); }let product2 = new Product(‘product2’);
for (let i = 0; i < 50; i++) { product2.number = i;
product2.setNumber(i); }
2.内部状态与外部状态
享元模式要求将对象的属性划分为内部状态与外部状态。享元模式的目标是尽量减少共享对象的数量。
关于如何划分内部、外部状态:
(1)内部状态存储于对象内部
(2)内部状态可以被一些对象共享
(3)内部状态独立于具体的场景,通常不会改变
(4)外部状态取决于具体的场景,并根据场景而变化,外部状态不能被共享。
3.享元模式的适用性
(1)一个程序中使用了大量的相似对象
(2)由于使用了大量对象,造成很大的内存开销
(3)对象的大多数状态都可以变为外部状态
(4)剥离出对象的外部状态之后,可以用相对较少的对象取代大量对象
4.享元模式的极端情况
(1)没有内部状态的享元
没有内部状态的享元实际上就是一个单例,但是因为其还是有剥离外部状态的过程,因此我们仍然将其称为享元
(2)没有外部状态的享元
没有外部状态的享元并不是一个纯粹的享元模式