理解设计模式(十二)——享元模式

享元模式

提出问题

当要创建大量相似对象时,需要消耗大量的系统资源。还记不记得我们之前讲到过,想要创建大量的相似对象,可以用原型模式。复制对象所用的资源要少于new新的对象。但是,存储对象所占用的内存空间是不会少的。如果我们想要节省内存空间应该怎么做?这就是我们今天要讲的享元模式

解决问题

想要节省存储空间,那就要少创建对象。但是我们终归还是要用到那么多对象的,该怎么办呢?我们可以只创建一个对象,然后到处都使用这一个对象。这听起来是不是有点像单例模式?我觉得他就是单例模式。只不过,享元模式是每个不同属性的对象只有一个。另外,享元模式还解决了一个问题:

尽管对象很相似,但是还是有不同点。同一个对象是完全相同的,该怎么表现这些不同点呢?我们可以把这些不同点当成另外一个独立的对象。

比如说我们有一个下围棋的应用。棋盘上所有的黑棋都是一模一样的,只是位置不一样。我们可以用一个棋子对象来表示所有的棋,而位置信息则存放在若干个位置对象中。

直接上代码:

class Position {
constructor(x, y) {
this.x = x;
this.y = y;
}
getPos() {
console.log(this.x, this.y);
}
}
class Chess {
constructor(color) {
this.color = color;
}
display(position) {
console.log("显示棋子:", this.color);
position.getPos();
}
}

class Factory {
constructor() {
this.pool = {};
}
getInstance(type) {
return this.pool[type] || new Chess(type);
}
}

let factory = new Factory();
let black1 = factory.getInstance("black");
let black2 = factory.getInstance("black");
let black3 = factory.getInstance("black");

let white1 = factory.getInstance("white");
let white2 = factory.getInstance("white");
let white3 = factory.getInstance("white");

black1.display(new Position(1,1));
black2.display(new Position(2,1));
black3.display(new Position(3,1));

white1.display(new Position(4,1));
white2.display(new Position(5,1));
white3.display(new Position(6,1));
Author: LeoB_O
Link: https://leob-o.github.io/2019/06/09/FlyweightPattern/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.