# 设计模式:享元模式

# 什么是享元模式

享元模式是一种内存优化的好方法,举一个生活中的例子。

比如一家服装网店需要拍服装照片男女款各50件。那么他们可以找男女模特各50个,让他们穿上照片来拍照。 但这样太麻烦了,换一种思路。只需要找一男一女两个模特,让他们换50套衣服来拍照就能完美的解决问题了。 这就是一个典型的享元模式的应用场景。

在程序中构建对象和存储对象都是需要资源的。享元模式可以帮你更好的管理你的对象池。

享元模式中有两个重要的概念:

  • 内部状态

    模特的性别就是内部状态,这个字段可以被50件衣服共享

  • 外部状态

    模特的衣服就是外部状态,每次拍照都要更换衣服。但模特还是那个模特

由此我们可以得出:

  • 内部状态储存于对象内部。
  • 内部状态可以被一些对象共享。
  • 内部状态独立于具体的场景,通常不会改变。
  • 外部状态取决于具体的场景,并根据场景而变化,外部状态不能被共享。

# Coding

var Model = function(sex) {
  this.sex = sex;
  this.clothing = ''
}
Model.prototype.setCothing = function(v) {
  this.clothing = v
}
Model.prototype.getPhoto = function() {
  console.log(`${this.sex} 模特穿上了 ${this.clothing}`)
}

var ManClothingList = [
  '雪中飞2020新款男士短款运动风保暖外套潮可脱卸帽时尚羽绒服反季',
  '莫代尔 长袖t恤男士圆领潮流秋装上衣服纯棉打底衫内搭秋衣',
  '科比裤子男湖人24总冠军联名aj官网詹姆斯23号春季休闲束脚运动裤',
  '优衣库 男装/女装 灯芯绒工装衬衫(水洗产品 长袖) 428955 UNIQLO',
  //  ... 50件
]

var WomanClothingList = [
  '王小鸭2020新款女秋季气质翻领黑色外套短款收腰显瘦大码西装外套',
  'ohsunny防晒衣2020新款长袖夏季薄款防紫外线透气立领百搭防晒服',
  'MOUSSY 秋冬新品个性立领拼接拉链时尚休闲夹克外套024CA130-0001',
  'JoyingFeng9/9 am0:00【英伦学姐】chao气质短款高腰风衣外套',
  '优衣库 女装 双面穿连帽外套 429062 UNIQLO',
  //  ... 50件
]

let manModel = new Model('男')
let womanModel = new Model('女')

// 1个男模特, 穿上50件不同的衣服
for (let i of ManClothingList) {
  manModel.setCothing(i)
  manModel.getPhoto()
}

// 1个男模特, 穿上50件不同的衣服
for (let i of WomanClothingList) {
  womanModel.setCothing(i)
  womanModel.getPhoto()
}

# 总结

一般来说, 下面这些场景更适合用享元模式

  • 一个程序中使用了大量的相似对象
  • 由于使用了大量的对象,造成了大量的内存开销
  • 对象的大多数状态都可以改变为外部状态
  • 剥离对象的外部状态后, 可以用相对较少的共享对象取代大量对象。
上次更新: 9/15/2020, 4:11:07 PM